dmencu 3.2.21 → 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 (226) 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.js +112 -38
  7. package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
  8. package/dist/client/unlogged/helpers-casilleros.js +12 -18
  9. package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
  10. package/dist/client/unlogged/helpers-formulario.js +88 -0
  11. package/dist/client/unlogged/redux-formulario.d.ts +1 -2
  12. package/dist/client/unlogged/redux-formulario.js +21 -31
  13. package/dist/client/unlogged/render-formulario.d.ts +2 -6
  14. package/dist/client/unlogged/render-formulario.js +29 -68
  15. package/dist/client/unlogged/render-formulario.tsx +29 -57
  16. package/dist/client/unlogged/render-general.js +1 -1
  17. package/dist/client/unlogged/render-general.tsx +1 -1
  18. package/dist/client/unlogged/tipos.d.ts +74 -40
  19. package/dist/client/unlogged/tipos.js +1 -1
  20. package/dist/server/app-dmencu.d.ts +1428 -0
  21. package/dist/server/app-dmencu.js +1054 -0
  22. package/dist/server/def-config.d.ts +1 -0
  23. package/dist/server/def-config.js +123 -0
  24. package/dist/server/procedures-dmencu.d.ts +43 -0
  25. package/dist/server/procedures-dmencu.js +2295 -0
  26. package/dist/server/server/app-dmencu.d.ts +42 -91
  27. package/dist/server/server/app-dmencu.js +114 -52
  28. package/dist/server/server/procedures-dmencu.d.ts +34 -2
  29. package/dist/server/server/procedures-dmencu.js +77 -51
  30. package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
  31. package/dist/server/server/setters-rea-no-rea.js +35 -0
  32. package/dist/server/server/table-areas.js +4 -4
  33. package/dist/server/server/table-areas_asignacion_general.js +2 -1
  34. package/dist/server/server/table-control_campo.js +4 -4
  35. package/dist/server/server/table-no_rea.js +4 -2
  36. package/dist/server/server/table-no_rea_sup.js +7 -3
  37. package/dist/server/server/table-personal.js +1 -1
  38. package/dist/server/server/table-tareas_tem.js +2 -2
  39. package/dist/server/server/table-tem.js +2 -2
  40. package/dist/server/server/types-dmencu.d.ts +34 -2
  41. package/dist/server/server/types-dmencu.js +2 -1
  42. package/dist/server/setters-rea-no-rea.d.ts +13 -0
  43. package/dist/server/setters-rea-no-rea.js +35 -0
  44. package/dist/server/table-acciones.d.ts +2 -0
  45. package/dist/server/table-acciones.js +45 -0
  46. package/dist/server/table-area_enc_proximas.d.ts +2 -0
  47. package/dist/server/table-area_enc_proximas.js +30 -0
  48. package/dist/server/table-areas.d.ts +4 -0
  49. package/dist/server/table-areas.js +112 -0
  50. package/dist/server/table-areas_asignacion_general.d.ts +2 -0
  51. package/dist/server/table-areas_asignacion_general.js +86 -0
  52. package/dist/server/table-barrios.d.ts +2 -0
  53. package/dist/server/table-barrios.js +35 -0
  54. package/dist/server/table-comunas.d.ts +2 -0
  55. package/dist/server/table-comunas.js +33 -0
  56. package/dist/server/table-control_campo.d.ts +12 -0
  57. package/dist/server/table-control_campo.js +119 -0
  58. package/dist/server/table-control_dias_carga.d.ts +2 -0
  59. package/dist/server/table-control_dias_carga.js +63 -0
  60. package/dist/server/table-control_resumen.d.ts +2 -0
  61. package/dist/server/table-control_resumen.js +19 -0
  62. package/dist/server/table-diccionario.d.ts +2 -0
  63. package/dist/server/table-diccionario.js +32 -0
  64. package/dist/server/table-dictra.d.ts +2 -0
  65. package/dist/server/table-dictra.js +46 -0
  66. package/dist/server/table-dicvar.d.ts +2 -0
  67. package/dist/server/table-dicvar.js +32 -0
  68. package/dist/server/table-encuestadores.d.ts +13 -0
  69. package/dist/server/table-encuestadores.js +75 -0
  70. package/dist/server/table-estados.d.ts +2 -0
  71. package/dist/server/table-estados.js +47 -0
  72. package/dist/server/table-estados_acciones.d.ts +2 -0
  73. package/dist/server/table-estados_acciones.js +40 -0
  74. package/dist/server/table-fracciones.d.ts +2 -0
  75. package/dist/server/table-fracciones.js +37 -0
  76. package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
  77. package/dist/server/table-grilla_hoja_ruta.js +93 -0
  78. package/dist/server/table-historial_tem.d.ts +2 -0
  79. package/dist/server/table-historial_tem.js +57 -0
  80. package/dist/server/table-hogares.d.ts +2 -0
  81. package/dist/server/table-hogares.js +156 -0
  82. package/dist/server/table-hogares_sup.d.ts +2 -0
  83. package/dist/server/table-hogares_sup.js +191 -0
  84. package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
  85. package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
  86. package/dist/server/table-manzanas.d.ts +2 -0
  87. package/dist/server/table-manzanas.js +36 -0
  88. package/dist/server/table-mis_encuestadores.d.ts +2 -0
  89. package/dist/server/table-mis_encuestadores.js +77 -0
  90. package/dist/server/table-mis_tareas.d.ts +2 -0
  91. package/dist/server/table-mis_tareas.js +18 -0
  92. package/dist/server/table-mis_tareas_areas.d.ts +2 -0
  93. package/dist/server/table-mis_tareas_areas.js +20 -0
  94. package/dist/server/table-modos_dm.d.ts +2 -0
  95. package/dist/server/table-modos_dm.js +28 -0
  96. package/dist/server/table-no_rea.js +38 -0
  97. package/dist/server/table-no_rea_sup.js +36 -0
  98. package/dist/server/table-operaciones.d.ts +2 -0
  99. package/dist/server/table-operaciones.js +30 -0
  100. package/dist/server/table-parametros.d.ts +2 -0
  101. package/dist/server/table-parametros.js +40 -0
  102. package/dist/server/table-permisos.d.ts +2 -0
  103. package/dist/server/table-permisos.js +31 -0
  104. package/dist/server/table-personal.d.ts +5 -0
  105. package/dist/server/table-personal.js +62 -0
  106. package/dist/server/table-personal_rol.d.ts +2 -0
  107. package/dist/server/table-personal_rol.js +42 -0
  108. package/dist/server/table-personas.d.ts +2 -0
  109. package/dist/server/table-personas.js +448 -0
  110. package/dist/server/table-personas_sup.d.ts +2 -0
  111. package/dist/server/table-personas_sup.js +93 -0
  112. package/dist/server/table-radios.d.ts +2 -0
  113. package/dist/server/table-radios.js +37 -0
  114. package/dist/server/table-rea.d.ts +2 -0
  115. package/dist/server/table-rea.js +38 -0
  116. package/dist/server/table-rea_sup.d.ts +2 -0
  117. package/dist/server/table-rea_sup.js +38 -0
  118. package/dist/server/table-recepcionistas.d.ts +2 -0
  119. package/dist/server/table-recepcionistas.js +18 -0
  120. package/dist/server/table-recuperadores.d.ts +2 -0
  121. package/dist/server/table-recuperadores.js +18 -0
  122. package/dist/server/table-roles.d.ts +2 -0
  123. package/dist/server/table-roles.js +33 -0
  124. package/dist/server/table-roles_permisos.d.ts +2 -0
  125. package/dist/server/table-roles_permisos.js +36 -0
  126. package/dist/server/table-roles_subordinados.d.ts +2 -0
  127. package/dist/server/table-roles_subordinados.js +31 -0
  128. package/dist/server/table-semanas.d.ts +2 -0
  129. package/dist/server/table-semanas.js +42 -0
  130. package/dist/server/table-sincronizaciones.d.ts +2 -0
  131. package/dist/server/table-sincronizaciones.js +30 -0
  132. package/dist/server/table-supervisores.d.ts +2 -0
  133. package/dist/server/table-supervisores.js +18 -0
  134. package/dist/server/table-tareas.d.ts +2 -0
  135. package/dist/server/table-tareas.js +48 -0
  136. package/dist/server/table-tareas_areas.d.ts +7 -0
  137. package/dist/server/table-tareas_areas.js +112 -0
  138. package/dist/server/table-tareas_proximas.d.ts +2 -0
  139. package/dist/server/table-tareas_proximas.js +48 -0
  140. package/dist/server/table-tareas_tem.d.ts +14 -0
  141. package/dist/server/table-tareas_tem.js +206 -0
  142. package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
  143. package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
  144. package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
  145. package/dist/server/table-tareas_tem_fin_campo.js +56 -0
  146. package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
  147. package/dist/server/table-tareas_tem_ingreso.js +31 -0
  148. package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
  149. package/dist/server/table-tareas_tem_procesamiento.js +34 -0
  150. package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
  151. package/dist/server/table-tareas_tem_recepcion.js +59 -0
  152. package/dist/server/table-tem.d.ts +3 -0
  153. package/dist/server/table-tem.js +247 -0
  154. package/dist/server/table-tem_asignacion.d.ts +2 -0
  155. package/dist/server/table-tem_asignacion.js +50 -0
  156. package/dist/server/table-tem_borradas.d.ts +2 -0
  157. package/dist/server/table-tem_borradas.js +35 -0
  158. package/dist/server/table-usuarios.d.ts +2 -0
  159. package/dist/server/table-usuarios.js +63 -0
  160. package/dist/server/table-visitas.d.ts +2 -0
  161. package/dist/server/table-visitas.js +91 -0
  162. package/dist/server/table-visitas_sup.d.ts +2 -0
  163. package/dist/server/table-visitas_sup.js +91 -0
  164. package/dist/server/table-viviendas.d.ts +2 -0
  165. package/dist/server/table-viviendas.js +299 -0
  166. package/dist/server/types-dmencu.d.ts +95 -0
  167. package/dist/server/types-dmencu.js +34 -0
  168. package/dist/server/unlogged/tipos.d.ts +74 -40
  169. package/dist/server/unlogged/tipos.js +1 -1
  170. package/dist/test/app-para-tests.d.ts +1115 -0
  171. package/dist/test/app-para-tests.js +95 -0
  172. package/dist/test/test-caches-rea.d.ts +1 -0
  173. package/dist/test/test-caches-rea.js +243 -0
  174. package/dist/test/test-helpers-casilleros.d.ts +1 -0
  175. package/dist/test/test-helpers-casilleros.js +154 -0
  176. package/dist/test/test-helpers-formulario.d.ts +1 -0
  177. package/dist/test/test-helpers-formulario.js +95 -0
  178. package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
  179. package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
  180. package/dist/test/test-menu-segun-rol.d.ts +1 -0
  181. package/dist/test/test-menu-segun-rol.js +170 -0
  182. package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
  183. package/dist/test/test-setters-rea-no-rea.js +95 -0
  184. package/dist/test/test.d.ts +6 -0
  185. package/dist/test/test.js +8 -2
  186. package/dist/unlogged/helpers-casilleros.d.ts +1 -1
  187. package/dist/unlogged/helpers-casilleros.js +12 -18
  188. package/dist/unlogged/helpers-formulario.d.ts +16 -0
  189. package/dist/unlogged/helpers-formulario.js +88 -0
  190. package/dist/unlogged/tipos.d.ts +1 -1
  191. package/dist/unlogged/tipos.js +1 -1
  192. package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
  193. package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
  194. package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
  195. package/dist/unlogged/unlogged/helpers-casilleros.js +7 -14
  196. package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
  197. package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
  198. package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
  199. package/dist/unlogged/unlogged/redux-formulario.js +21 -31
  200. package/dist/unlogged/unlogged/render-formulario.d.ts +2 -6
  201. package/dist/unlogged/unlogged/render-formulario.js +29 -68
  202. package/dist/unlogged/unlogged/render-formulario.tsx +29 -57
  203. package/dist/unlogged/unlogged/render-general.js +1 -1
  204. package/dist/unlogged/unlogged/render-general.tsx +1 -1
  205. package/dist/unlogged/unlogged/tipos.d.ts +74 -40
  206. package/dist/unlogged/unlogged/tipos.js +1 -1
  207. package/dist/unlogged/unlogged/unlogged.js +2 -2
  208. package/install/accion_cumple_condicion.sql +1 -1
  209. package/install/generador_accion_cumple_condicion.sql +2 -2
  210. package/install/tarea_cumple_condicion.sql +1 -1
  211. package/install/xcalcular_resultado_trg.sql +1 -1
  212. package/package.json +20 -17
  213. package/dist/server/server/table-no_rea copy.js +0 -38
  214. package/dist/server/server/table-no_rea_sup copy.js +0 -36
  215. package/dist/unlogged/bypass-formulario.d.ts +0 -198
  216. package/dist/unlogged/bypass-formulario.js +0 -1226
  217. package/dist/unlogged/redux-formulario.d.ts +0 -440
  218. package/dist/unlogged/redux-formulario.js +0 -324
  219. package/dist/unlogged/render-config.d.ts +0 -52
  220. package/dist/unlogged/render-config.js +0 -161
  221. package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
  222. package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
  223. package/dist/unlogged/unlogged/helpers.d.ts +0 -14
  224. package/dist/unlogged/unlogged/helpers.js +0 -129
  225. /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
  226. /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
@@ -0,0 +1,95 @@
1
+ (function (factory) {
2
+ if (typeof module === "object" && typeof module.exports === "object") {
3
+ var v = factory(require, exports);
4
+ if (v !== undefined) module.exports = v;
5
+ }
6
+ else if (typeof define === "function" && define.amd) {
7
+ define(["require", "exports", "node:fs", "node:path", "meta-enc", "procesamiento", "../server/app-dmencu"], factory);
8
+ }
9
+ })(function (require, exports) {
10
+ "use strict";
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AppDmEncuParaTests = void 0;
13
+ exports.crearAppParaTests = crearAppParaTests;
14
+ exports.permisosDeInstalacion = permisosDeInstalacion;
15
+ exports.contextoDelRol = contextoDelRol;
16
+ const fs = require("node:fs");
17
+ const path = require("node:path");
18
+ const meta_enc_1 = require("meta-enc");
19
+ const procesamiento_1 = require("procesamiento");
20
+ const app_dmencu_1 = require("../server/app-dmencu");
21
+ // La app compuesta igual que en server-dmencu.ts, pero sin llamar a start():
22
+ // no se conecta a la base ni levanta el servidor.
23
+ exports.AppDmEncuParaTests = (0, app_dmencu_1.emergeAppDmEncu)((0, procesamiento_1.emergeAppProcesamiento)((0, procesamiento_1.emergeAppConsistencias)((0, procesamiento_1.emergeAppDatosExt)((0, meta_enc_1.emergeAppMetaEnc)((0, meta_enc_1.emergeAppRelEnc)((0, procesamiento_1.emergeAppVarCal)((0, meta_enc_1.emergeAppOperativos)(meta_enc_1.AppBackend))))))));
24
+ // policy 'web' es el modo RELEVAMIENTO (dispositivos), cualquier otra es GABINETE (ver getModoByPolicy)
25
+ function crearAppParaTests(policy = '') {
26
+ var be = new exports.AppDmEncuParaTests();
27
+ // la configuración se carga en start(); se completa sólo la parte del servidor
28
+ be.config.server = {
29
+ 'base-url': '',
30
+ port: 3000,
31
+ 'session-store': 'memory',
32
+ 'ip-replacer': '',
33
+ 'silent-startup': true,
34
+ 'kill-9': '',
35
+ bitacoraSchema: '',
36
+ bitacoraTableName: '',
37
+ useCors: false,
38
+ allowedHosts: [],
39
+ policy,
40
+ };
41
+ var permisos = permisosDeInstalacion();
42
+ be.caches.permisosRol = permisos.permisosRol;
43
+ be.caches.permisosRolSoloTrue = permisos.permisosRol;
44
+ be.caches.permisosSuperuser = permisos.permisosSuperuser;
45
+ be.caches.permisosParaNadie = permisos.permisosParaNadie;
46
+ return be;
47
+ }
48
+ function leerTab(nombreArchivo) {
49
+ // los tests corren desde dist/test
50
+ var contenido = fs.readFileSync(path.join(__dirname, '../../install', nombreArchivo), 'utf8');
51
+ var [encabezado, ...lineas] = contenido.split(/\r?\n/).filter(linea => linea.trim() != '');
52
+ var columnas = encabezado.split('|').map(columna => columna.trim());
53
+ return lineas.map(linea => {
54
+ var valores = linea.split('|').map(valor => valor.trim());
55
+ var fila = {};
56
+ columnas.forEach((columna, i) => { fila[columna] = valores[i]; });
57
+ return fila;
58
+ });
59
+ }
60
+ function puedeDe(filas, habilitado) {
61
+ var puede = {};
62
+ filas.forEach(fila => {
63
+ puede[fila.permiso] = puede[fila.permiso] || {};
64
+ puede[fila.permiso][fila.accion] = habilitado(fila);
65
+ });
66
+ return puede;
67
+ }
68
+ // Arma los permisos como lo hace postConfig en app-dmencu.ts (que los lee de la base),
69
+ // a partir de los .tab con que se instala la base
70
+ function permisosDeInstalacion() {
71
+ var roles = leerTab('roles.tab');
72
+ var rolesPermisos = leerTab('roles_permisos.tab');
73
+ var permisos = leerTab('permisos.tab');
74
+ var permisosRol = {};
75
+ roles.forEach(rol => {
76
+ var filasDelRol = rolesPermisos.filter(rp => rp.rol == rol.rol);
77
+ permisosRol[rol.rol] = {
78
+ superuser: rol.superuser == 'true',
79
+ puede: filasDelRol.length ? puedeDe(filasDelRol, rp => rp.habilitado == 'true') : undefined,
80
+ };
81
+ });
82
+ return {
83
+ permisosRol,
84
+ permisosSuperuser: puedeDe(permisos, () => true),
85
+ permisosParaNadie: puedeDe(permisos, () => false),
86
+ };
87
+ }
88
+ // contexto como el que arma getContext para un usuario con ese rol
89
+ function contextoDelRol(be, rol, idper = 'PER1') {
90
+ var user = { rol, idper, usuario: 'usu_' + rol };
91
+ return Object.assign(Object.assign({}, (0, app_dmencu_1.permisosSegunUsuario)(be.caches, user)), { be,
92
+ user, session: {}, username: user.usuario, machineId: 'test', navigator: 'test' });
93
+ }
94
+ });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXBhcmEtdGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9hcHAtcGFyYS10ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUE4QkEsOENBc0JDO0lBNEJELHNEQWlCQztJQUdELHdDQVdDO0lBL0dELDhCQUE4QjtJQUM5QixrQ0FBa0M7SUFFbEMsdUNBQThGO0lBQzlGLGlEQUFtSDtJQUVuSCxxREFBNkU7SUFHN0UsNkVBQTZFO0lBQzdFLGtEQUFrRDtJQUNyQyxRQUFBLGtCQUFrQixHQUFHLElBQUEsNEJBQWUsRUFDN0MsSUFBQSxzQ0FBc0IsRUFDbEIsSUFBQSxzQ0FBc0IsRUFDbEIsSUFBQSxpQ0FBaUIsRUFDYixJQUFBLDJCQUFnQixFQUNaLElBQUEsMEJBQWUsRUFDWCxJQUFBLCtCQUFlLEVBQ1gsSUFBQSw4QkFBbUIsRUFBQyxxQkFBVSxDQUFDLENBQ2xDLENBQ0osQ0FDSixDQUNKLENBQ0osQ0FDSixDQUNKLENBQUM7SUFJRix3R0FBd0c7SUFDeEcsU0FBZ0IsaUJBQWlCLENBQUMsU0FBaUIsRUFBRTtRQUNqRCxJQUFJLEVBQUUsR0FBRyxJQUFJLDBCQUFrQixFQUFFLENBQUM7UUFDbEMsK0VBQStFO1FBQy9FLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ2YsVUFBVSxFQUFFLEVBQUU7WUFDZCxJQUFJLEVBQUUsSUFBSTtZQUNWLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsUUFBUSxFQUFFLEVBQUU7WUFDWixjQUFjLEVBQUUsRUFBRTtZQUNsQixpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsWUFBWSxFQUFFLEVBQUU7WUFDaEIsTUFBTTtTQUNULENBQUM7UUFDRixJQUFJLFFBQVEsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZDLEVBQUUsQ0FBQyxN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LEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTTtnQkFDbEMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzlGLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU87WUFDSCxXQUFXO1lBQ1gsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDaEQsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDcEQsQ0FBQztJQUNOLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsU0FBZ0IsY0FBYyxDQUFDLEVBQWdCLEVBQUUsR0FBVyxFQUFFLFFBQWdCLE1BQU07UUFDaEYsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDakQsdUNBQ08sSUFBQSxpQ0FBb0IsRUFBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUN4QyxFQUFFO1lBQ0YsSUFBSSxFQUNKLE9BQU8sRUFBRSxFQUFFLEVBQ1gsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQ3RCLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLFNBQVMsRUFBRSxNQUFNLElBQ25CO0lBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBBcHBCYWNrZW5kLCBlbWVyZ2VBcHBNZXRhRW5jLCBlbWVyZ2VBcHBPcGVyYXRpdm9zLCBlbWVyZ2VBcHBSZWxFbmMgfSBmcm9tICdtZXRhLWVuYyc7XG5pbXBvcnQgeyBlbWVyZ2VBcHBDb25zaXN0ZW5jaWFzLCBlbWVyZ2VBcHBEYXRvc0V4dCwgZW1lcmdlQXBwUHJvY2VzYW1pZW50bywgZW1lcmdlQXBwVmFyQ2FsIH0gZnJvbSAncHJvY2VzYW1pZW50byc7XG5cbmltcG9ydCB7IGVtZXJnZUFwcERtRW5jdSwgcGVybWlzb3NTZWd1blVzdWFyaW8gfSBmcm9tICcuLi9zZXJ2ZXIvYXBwLWRtZW5jdSc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQsIFBlcm1pc29zUm9sLCBQdWVkZSB9IGZyb20gJy4uL3NlcnZlci90eXBlcy1kbWVuY3UnO1xuXG4vLyBMYSBhcHAgY29tcHVlc3RhIGlndWFsIHF1ZSBlbiBzZXJ2ZXItZG1lbmN1LnRzLCBwZXJvIHNpbiBsbGFtYXIgYSBzdGFydCgpOlxuLy8gbm8gc2UgY29uZWN0YSBhIGxhIGJhc2UgbmkgbGV2YW50YSBlbCBzZXJ2aWRvci5cbmV4cG9ydCBjb25zdCBBcHBEbUVuY3VQYXJhVGVzdHMgPSBlbWVyZ2VBcHBEbUVuY3UoXG4gICAgZW1lcmdlQXBwUHJvY2VzYW1pZW50byhcbiAgICAgICAgZW1lcmdlQXBwQ29uc2lzdGVuY2lhcyhcbiAgICAgICAgICAgIGVtZXJnZUFwcERhdG9zRXh0KFxuICAgICAgICAgICAgICAgIGVtZXJnZUFwcE1ldGFFbmMoXG4gICAgICAgICAgICAgICAgICAgIGVtZXJnZUFwcFJlbEVuYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtZXJnZUFwcFZhckNhbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWVyZ2VBcHBPcGVyYXRpdm9zKEFwcEJhY2tlbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApXG4pO1xuXG5leHBvcnQgdHlwZSBBcHBQYXJhVGVzdHMgPSBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcERtRW5jdVBhcmFUZXN0cz47XG5cbi8vIHBvbGljeSAnd2ViJyBlcyBlbCBtb2RvIFJFTEVWQU1JRU5UTyAoZGlzcG9zaXRpdm9zKSwgY3VhbHF1aWVyIG90cmEgZXMgR0FCSU5FVEUgKHZlciBnZXRNb2RvQnlQb2xpY3kpXG5leHBvcnQgZnVuY3Rpb24gY3JlYXJBcHBQYXJhVGVzdHMocG9saWN5OiBzdHJpbmcgPSAnJyk6IEFwcFBhcmFUZXN0cyB7XG4gICAgdmFyIGJlID0gbmV3IEFwcERtRW5jdVBhcmFUZXN0cygpO1xuICAgIC8vIGxhIGNvbmZpZ3VyYWNpw7NuIHNlIGNhcmdhIGVuIHN0YXJ0KCk7IHNlIGNvbXBsZXRhIHPDs2xvIGxhIHBhcnRlIGRlbCBzZXJ2aWRvclxuICAgIGJlLmNvbmZpZy5zZXJ2ZXIgPSB7XG4gICAgICAgICdiYXNlLXVybCc6ICcnLFxuICAgICAgICBwb3J0OiAzMDAwLFxuICAgICAgICAnc2Vzc2lvbi1zdG9yZSc6ICdtZW1vcnknLFxuICAgICAgICAnaXAtcmVwbGFjZXInOiAnJyxcbiAgICAgICAgJ3NpbGVudC1zdGFydHVwJzogdHJ1ZSxcbiAgICAgICAgJ2tpbGwtOSc6ICcnLFxuICAgICAgICBiaXRhY29yYVNjaGVtYTogJycsXG4gICAgICAgIGJpdGFjb3JhVGFibGVOYW1lOiAnJyxcbiAgICAgICAgdXNlQ29yczogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRIb3N0czogW10sXG4gICAgICAgIHBvbGljeSxcbiAgICB9O1xuICAgIHZhciBwZXJtaXNvcyA9IHBlcm1pc29zRGVJbnN0YWxhY2lvbigpO1xuICAgIGJlLmNhY2hlcy5wZXJtaXNvc1JvbCA9IHBlcm1pc29zLnBlcm1pc29zUm9sO1xuICAgIGJlLmNhY2hlcy5wZXJtaXNvc1JvbFNvbG9UcnVlID0gcGVybWlzb3MucGVybWlzb3NSb2w7XG4gICAgYmUuY2FjaGVzLnBlcm1pc29zU3VwZXJ1c2VyID0gcGVybWlzb3MucGVybWlzb3NTdXBlcnVzZXI7XG4gICAgYmUuY2FjaGVzLnBlcm1pc29zUGFyYU5hZGllID0gcGVybWlzb3MucGVybWlzb3NQYXJhTmFkaWU7XG4gICAgcmV0dXJuIGJlO1xufVxuXG50eXBlIEZpbGFUYWIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG5mdW5jdGlvbiBsZWVyVGFiKG5vbWJyZUFyY2hpdm86IHN0cmluZyk6IEZpbGFUYWJbXSB7XG4gICAgLy8gbG9zIHRlc3RzIGNvcnJlbiBkZXNkZSBkaXN0L3Rlc3RcbiAgICB2YXIgY29udGVuaWRvID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9pbnN0YWxsJywgbm9tYnJlQXJjaGl2byksICd1dGY4Jyk7XG4gICAgdmFyIFtlbmNhYmV6YWRvLCAuLi5saW5lYXNdID0gY29udGVuaWRvLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKGxpbmVhID0+IGxpbmVhLnRyaW0oKSAhPSAnJyk7XG4gICAgdmFyIGNvbHVtbmFzID0gZW5jYWJlemFkby5zcGxpdCgnfCcpLm1hcChjb2x1bW5hID0+IGNvbHVtbmEudHJpbSgpKTtcbiAgICByZXR1cm4gbGluZWFzLm1hcChsaW5lYSA9PiB7XG4gICAgICAgIHZhciB2YWxvcmVzID0gbGluZWEuc3BsaXQoJ3wnKS5tYXAodmFsb3IgPT4gdmFsb3IudHJpbSgpKTtcbiAgICAgICAgdmFyIGZpbGE6IEZpbGFUYWIgPSB7fTtcbiAgICAgICAgY29sdW1uYXMuZm9yRWFjaCgoY29sdW1uYSwgaSkgPT4geyBmaWxhW2NvbHVtbmFdID0gdmFsb3Jlc1tpXTsgfSk7XG4gICAgICAgIHJldHVybiBmaWxhO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwdWVkZURlKGZpbGFzOiBGaWxhVGFiW10sIGhhYmlsaXRhZG86IChmaWxhOiBGaWxhVGFiKSA9PiBib29sZWFuKTogUHVlZGUge1xuICAgIHZhciBwdWVkZTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+ID0ge307XG4gICAgZmlsYXMuZm9yRWFjaChmaWxhID0+IHtcbiAgICAgICAgcHVlZGVbZmlsYS5wZXJtaXNvXSA9IHB1ZWRlW2ZpbGEucGVybWlzb10gfHwge307XG4gICAgICAgIHB1ZWRlW2ZpbGEucGVybWlzb11bZmlsYS5hY2Npb25dID0gaGFiaWxpdGFkbyhmaWxhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHVlZGU7XG59XG5cbi8vIEFybWEgbG9zIHBlcm1pc29zIGNvbW8gbG8gaGFjZSBwb3N0Q29uZmlnIGVuIGFwcC1kbWVuY3UudHMgKHF1ZSBsb3MgbGVlIGRlIGxhIGJhc2UpLFxuLy8gYSBwYXJ0aXIgZGUgbG9zIC50YWIgY29uIHF1ZSBzZSBpbnN0YWxhIGxhIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNvc0RlSW5zdGFsYWNpb24oKTogeyBwZXJtaXNvc1JvbDogUGVybWlzb3NSb2wsIHBlcm1pc29zU3VwZXJ1c2VyOiBQdWVkZSwgcGVybWlzb3NQYXJhTmFkaWU6IFB1ZWRlIH0ge1xuICAgIHZhciByb2xlcyA9IGxlZXJUYWIoJ3JvbGVzLnRhYicpO1xuICAgIHZhciByb2xlc1Blcm1pc29zID0gbGVlclRhYigncm9sZXNfcGVybWlzb3MudGFiJyk7XG4gICAgdmFyIHBlcm1pc29zID0gbGVlclRhYigncGVybWlzb3MudGFiJyk7XG4gICAgdmFyIHBlcm1pc29zUm9sOiBQZXJtaXNvc1JvbCA9IHt9O1xuICAgIHJvbGVzLmZvckVhY2gocm9sID0+IHtcbiAgICAgICAgdmFyIGZpbGFzRGVsUm9sID0gcm9sZXNQZXJtaXNvcy5maWx0ZXIocnAgPT4gcnAucm9sID09IHJvbC5yb2wpO1xuICAgICAgICBwZXJtaXNvc1JvbFtyb2wucm9sXSA9IHtcbiAgICAgICAgICAgIHN1cGVydXNlcjogcm9sLnN1cGVydXNlciA9PSAndHJ1ZScsXG4gICAgICAgICAgICBwdWVkZTogZmlsYXNEZWxSb2wubGVuZ3RoID8gcHVlZGVEZShmaWxhc0RlbFJvbCwgcnAgPT4gcnAuaGFiaWxpdGFkbyA9PSAndHJ1ZScpIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBlcm1pc29zUm9sLFxuICAgICAgICBwZXJtaXNvc1N1cGVydXNlcjogcHVlZGVEZShwZXJtaXNvcywgKCkgPT4gdHJ1ZSksXG4gICAgICAgIHBlcm1pc29zUGFyYU5hZGllOiBwdWVkZURlKHBlcm1pc29zLCAoKSA9PiBmYWxzZSksXG4gICAgfTtcbn1cblxuLy8gY29udGV4dG8gY29tbyBlbCBxdWUgYXJtYSBnZXRDb250ZXh0IHBhcmEgdW4gdXN1YXJpbyBjb24gZXNlIHJvbFxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRleHRvRGVsUm9sKGJlOiBBcHBQYXJhVGVzdHMsIHJvbDogc3RyaW5nLCBpZHBlcjogc3RyaW5nID0gJ1BFUjEnKTogQ29udGV4dCB7XG4gICAgdmFyIHVzZXIgPSB7IHJvbCwgaWRwZXIsIHVzdWFyaW86ICd1c3VfJyArIHJvbCB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnBlcm1pc29zU2VndW5Vc3VhcmlvKGJlLmNhY2hlcywgdXNlciksXG4gICAgICAgIGJlLFxuICAgICAgICB1c2VyLFxuICAgICAgICBzZXNzaW9uOiB7fSxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXIudXN1YXJpbyxcbiAgICAgICAgbWFjaGluZUlkOiAndGVzdCcsXG4gICAgICAgIG5hdmlnYXRvcjogJ3Rlc3QnLFxuICAgIH07XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,243 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ (function (factory) {
11
+ if (typeof module === "object" && typeof module.exports === "object") {
12
+ var v = factory(require, exports);
13
+ if (v !== undefined) module.exports = v;
14
+ }
15
+ else if (typeof define === "function" && define.amd) {
16
+ define(["require", "exports", "mocha", "node:assert", "../server/app-dmencu", "../server/procedures-dmencu", "../unlogged/helpers-casilleros", "./app-para-tests"], factory);
17
+ }
18
+ })(function (require, exports) {
19
+ "use strict";
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ const mocha_1 = require("mocha");
22
+ const assert = require("node:assert");
23
+ const app_dmencu_1 = require("../server/app-dmencu");
24
+ const procedures_dmencu_1 = require("../server/procedures-dmencu");
25
+ const helpers_casilleros_1 = require("../unlogged/helpers-casilleros");
26
+ const app_para_tests_1 = require("./app-para-tests");
27
+ // se listan acá (y no se importa TABLAS_REA_NO_REA) para que el test falle si alguna deja de tratarse
28
+ const TABLAS_REA_NO_REA = ['rea', 'no_rea', 'rea_sup', 'no_rea_sup'];
29
+ // Base de datos en memoria: cada consulta se resuelve por la tabla del "from"
30
+ class BaseFalsa {
31
+ constructor(tablas) {
32
+ this.tablas = tablas;
33
+ this.consultas = [];
34
+ }
35
+ query(sql) {
36
+ var _a, _b, _c, _d, _e;
37
+ this.consultas.push(sql);
38
+ var tabla = (_b = (_a = /from (\w+)/.exec(sql)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';
39
+ var filas = (_c = this.tablas[tabla]) !== null && _c !== void 0 ? _c : [];
40
+ if (/group by grupo0?(_sup)? /.test(sql + ' ')) {
41
+ var campoGrupo = (_e = (_d = /select (\w+)/.exec(sql)) === null || _d === void 0 ? void 0 : _d[1]) !== null && _e !== void 0 ? _e : 'grupo';
42
+ var alias = /as grupo,/.test(sql) ? 'grupo' : campoGrupo;
43
+ var grupos = {};
44
+ filas.forEach(fila => {
45
+ var grupo = String(fila[campoGrupo]);
46
+ grupos[grupo] = grupos[grupo] || [];
47
+ grupos[grupo].push(fila);
48
+ });
49
+ filas = Object.keys(grupos).sort().map(grupo => ({ [alias]: grupo, codigos: grupos[grupo] }));
50
+ }
51
+ return {
52
+ fetchAll: () => __awaiter(this, void 0, void 0, function* () { return ({ rowCount: filas.length, rows: filas, fields: [] }); }),
53
+ fetchUniqueRow: () => __awaiter(this, void 0, void 0, function* () { return ({ rowCount: 1, row: filas[0], fields: [] }); }),
54
+ };
55
+ }
56
+ }
57
+ const noReas = [
58
+ { operativo: 'etoi211', no_rea: 1, descripcion: 'ausente', grupo: 'ausencia', variable: 'v1', valor: '7', grupo0: 'encuestable', orden: 1 },
59
+ { operativo: 'etoi211', no_rea: 2, descripcion: 'rechazo', grupo: 'rechazo', variable: 'v1', valor: '8', grupo0: 'encuestable', orden: 2 },
60
+ { operativo: 'eah2022', no_rea: 1, descripcion: 'deshabitada', grupo: 'no encuestable', variable: 'v1', valor: '9', grupo0: 'no encuestable', orden: 1 },
61
+ ];
62
+ const noReasSup = [
63
+ { operativo: 'etoi211', no_rea_sup: 71, desc_norea_sup: 'no contacto', grupo_sup: 'sin contacto', variable_sup: 's1', valor_sup: '2', grupo0_sup: 'sup', orden: 1 },
64
+ { operativo: 'eah2022', no_rea_sup: 72, desc_norea_sup: 'otro', grupo_sup: 'otro', variable_sup: 's1', valor_sup: '3', grupo0_sup: 'sup', orden: 1 },
65
+ ];
66
+ const reas = [
67
+ { operativo: 'etoi211', rea: 1, descripcion: 'completa', condicion: 'v1 = 1 and v2 > 10', orden: 1, es_positiva: true, tarea: null },
68
+ { operativo: 'etoi211', rea: 2, descripcion: 'incompleta', condicion: 'v1 = 1', orden: 2, es_positiva: false, tarea: 'encu' },
69
+ { operativo: 'eah2022', rea: 1, descripcion: 'otra', condicion: 'v3 = 5', orden: 1, es_positiva: true, tarea: null },
70
+ ];
71
+ const reasSup = [
72
+ { operativo: 'etoi211', rea_sup: 1, descripcion: 'supervisada', condicion: 's1 = 1', orden: 1, es_positiva: true, tarea: 'supe' },
73
+ ];
74
+ const operativos = [{ con_rea_hogar: true, operativo: 'etoi211', config_sorteo: null }];
75
+ function baseConDatos() {
76
+ return new BaseFalsa({ no_rea: noReas, rea: reas, no_rea_sup: noReasSup, rea_sup: reasSup, operativos });
77
+ }
78
+ // evalúa una condición compilada (condicion_js) como lo hace el dispositivo
79
+ function evaluar(condicionJs, valores) {
80
+ var funcion = new Function('valores', 'helpers', 'return ' + condicionJs);
81
+ return funcion(valores, helpers_casilleros_1.helpersCasilleros);
82
+ }
83
+ (0, mocha_1.describe)('dmencu - caches de rea/no rea', () => {
84
+ (0, mocha_1.describe)('refreshCaches', () => {
85
+ (0, mocha_1.it)('carga rea, no rea y sus versiones _sup', () => __awaiter(void 0, void 0, void 0, function* () {
86
+ var be = (0, app_para_tests_1.crearAppParaTests)();
87
+ yield be.refreshCaches(baseConDatos());
88
+ assert.deepStrictEqual(be.caches.tableContent.no_rea, noReas);
89
+ assert.deepStrictEqual(be.caches.tableContent.rea, reas);
90
+ assert.deepStrictEqual(be.caches.tableContent.no_rea_sup, noReasSup);
91
+ assert.deepStrictEqual(be.caches.tableContent.rea_sup, reasSup);
92
+ }));
93
+ (0, mocha_1.it)('pide a la base las listas ordenadas por operativo y orden (define la prioridad de evaluación)', () => __awaiter(void 0, void 0, void 0, function* () {
94
+ var be = (0, app_para_tests_1.crearAppParaTests)();
95
+ var base = baseConDatos();
96
+ yield be.refreshCaches(base);
97
+ for (var tabla of TABLAS_REA_NO_REA) {
98
+ var consulta = base.consultas.find(sql => new RegExp(`from ${tabla} order by`).test(sql));
99
+ assert.ok(consulta, `no se consultó ${tabla}`);
100
+ assert.match(consulta, new RegExp(`order by operativo, orden, ${tabla}`));
101
+ }
102
+ }));
103
+ (0, mocha_1.it)('agrupa los no rea por grupo y por grupo0', () => __awaiter(void 0, void 0, void 0, function* () {
104
+ var be = (0, app_para_tests_1.crearAppParaTests)();
105
+ yield be.refreshCaches(baseConDatos());
106
+ assert.deepStrictEqual(be.caches.tableContent.no_rea_groups.map((g) => g.grupo), ['ausencia', 'no encuestable', 'rechazo']);
107
+ assert.deepStrictEqual(be.caches.tableContent.no_rea_groups0.map((g) => g.grupo), ['encuestable', 'no encuestable']);
108
+ }));
109
+ (0, mocha_1.it)('carga la configuración del operativo actual (con_rea_hogar)', () => __awaiter(void 0, void 0, void 0, function* () {
110
+ var be = (0, app_para_tests_1.crearAppParaTests)();
111
+ yield be.refreshCaches(baseConDatos());
112
+ assert.deepStrictEqual(be.caches.tableContent.conReaHogar, operativos[0]);
113
+ }));
114
+ (0, mocha_1.it)('al recargar reemplaza los datos anteriores', () => __awaiter(void 0, void 0, void 0, function* () {
115
+ var be = (0, app_para_tests_1.crearAppParaTests)();
116
+ var base = baseConDatos();
117
+ yield be.refreshCaches(base);
118
+ base.tablas.rea = [reas[0]];
119
+ yield be.refreshCaches(base);
120
+ assert.deepStrictEqual(be.caches.tableContent.rea, [reas[0]]);
121
+ }));
122
+ });
123
+ (0, mocha_1.describe)('refrescarEstructuraAlModificarTabla (envuelve table_record_save y table_record_delete)', () => {
124
+ function prepararRefrescador() {
125
+ var eventos = [];
126
+ var clientesRefrescados = [];
127
+ var be = {
128
+ caches: { timestampEstructura: 0 },
129
+ refreshCaches: (client) => __awaiter(this, void 0, void 0, function* () {
130
+ eventos.push('refrescar');
131
+ clientesRefrescados.push(client);
132
+ }),
133
+ };
134
+ var llamadas = [];
135
+ var guardar = (_context, parameters, extra) => __awaiter(this, void 0, void 0, function* () {
136
+ eventos.push('guardar');
137
+ llamadas.push({ tabla: parameters.table, extra });
138
+ return { guardado: parameters.table };
139
+ });
140
+ return { be, eventos, clientesRefrescados, llamadas, guardar };
141
+ }
142
+ for (const tabla of TABLAS_REA_NO_REA) {
143
+ (0, mocha_1.it)(`al modificar ${tabla} recarga las caches después de guardar y cambia la estructura`, () => __awaiter(void 0, void 0, void 0, function* () {
144
+ var { be, eventos, clientesRefrescados, guardar } = prepararRefrescador();
145
+ var client = new BaseFalsa({});
146
+ var resultado = yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client }, { table: tabla });
147
+ assert.deepStrictEqual(resultado, { guardado: tabla });
148
+ assert.deepStrictEqual(eventos, ['guardar', 'refrescar']);
149
+ assert.strictEqual(clientesRefrescados[0], client, 'debe recargar con el mismo cliente (misma transacción)');
150
+ assert.ok(be.caches.timestampEstructura > 0);
151
+ }));
152
+ }
153
+ for (const tabla of ['casilleros', 'semanas']) {
154
+ (0, mocha_1.it)(`al modificar ${tabla} cambia la estructura sin recargar las caches de rea`, () => __awaiter(void 0, void 0, void 0, function* () {
155
+ var { be, eventos, guardar } = prepararRefrescador();
156
+ yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: tabla });
157
+ assert.deepStrictEqual(eventos, ['guardar']);
158
+ assert.ok(be.caches.timestampEstructura > 0);
159
+ }));
160
+ }
161
+ (0, mocha_1.it)('al modificar otras tablas no toca la estructura ni las caches', () => __awaiter(void 0, void 0, void 0, function* () {
162
+ var { be, eventos, guardar } = prepararRefrescador();
163
+ yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: 'usuarios' });
164
+ assert.deepStrictEqual(eventos, ['guardar']);
165
+ assert.strictEqual(be.caches.timestampEstructura, 0);
166
+ }));
167
+ (0, mocha_1.it)('si falla el guardado no recarga ni cambia la estructura', () => __awaiter(void 0, void 0, void 0, function* () {
168
+ var { be, eventos } = prepararRefrescador();
169
+ var guardarConError = (_context, _parameters) => __awaiter(void 0, void 0, void 0, function* () {
170
+ eventos.push('guardar');
171
+ throw new Error('error al guardar');
172
+ });
173
+ yield assert.rejects((0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardarConError)({ client: new BaseFalsa({}) }, { table: 'rea' }), /error al guardar/);
174
+ assert.deepStrictEqual(eventos, ['guardar']);
175
+ assert.strictEqual(be.caches.timestampEstructura, 0);
176
+ }));
177
+ (0, mocha_1.it)('pasa a la función original los argumentos extra (files/opts de table_record_save)', () => __awaiter(void 0, void 0, void 0, function* () {
178
+ var { be, llamadas, guardar } = prepararRefrescador();
179
+ var extra = { files: [] };
180
+ yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: 'no_rea' }, extra);
181
+ assert.strictEqual(llamadas[0].extra, extra);
182
+ }));
183
+ });
184
+ (0, mocha_1.describe)('reasNoReasDelOperativo (rea/no rea en la estructura que recibe el dispositivo)', () => {
185
+ const tableContent = { no_rea: noReas, no_rea_sup: noReasSup, rea: reas, rea_sup: reasSup };
186
+ (0, mocha_1.it)('filtra cada lista por operativo', () => {
187
+ var resultado = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211');
188
+ assert.deepStrictEqual(resultado.noReas, [noReas[0], noReas[1]]);
189
+ assert.deepStrictEqual(resultado.noReasSup, [noReasSup[0]]);
190
+ assert.deepStrictEqual(resultado.reas.map(rea => rea.rea), [1, 2]);
191
+ assert.deepStrictEqual(resultado.reasSup.map(reaSup => reaSup.rea_sup), [1]);
192
+ });
193
+ (0, mocha_1.it)('conserva el orden de las caches (que viene ordenado por orden)', () => {
194
+ var resultado = (0, procedures_dmencu_1.reasNoReasDelOperativo)(Object.assign(Object.assign({}, tableContent), { rea: [reas[1], reas[0]] }), 'etoi211');
195
+ assert.deepStrictEqual(resultado.reas.map(rea => rea.rea), [2, 1]);
196
+ });
197
+ (0, mocha_1.it)('compila las condiciones de rea a js evaluable en el dispositivo', () => {
198
+ var [completa, incompleta] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reas;
199
+ assert.strictEqual(evaluar(completa.condicion_js, { v1: 1, v2: 11 }), true);
200
+ assert.strictEqual(evaluar(completa.condicion_js, { v1: 1, v2: 5 }), false);
201
+ assert.strictEqual(evaluar(incompleta.condicion_js, { v1: 1 }), true);
202
+ assert.strictEqual(evaluar(incompleta.condicion_js, { v1: 2 }), false);
203
+ });
204
+ (0, mocha_1.it)('compila las condiciones de rea_sup', () => {
205
+ var [supervisada] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reasSup;
206
+ assert.strictEqual(evaluar(supervisada.condicion_js, { s1: 1 }), true);
207
+ assert.strictEqual(evaluar(supervisada.condicion_js, { s1: 2 }), false);
208
+ });
209
+ (0, mocha_1.it)('las variables sin cargar se toman como 0 (no rompen la evaluación)', () => {
210
+ var [completa] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reas;
211
+ assert.strictEqual(evaluar(completa.condicion_js, {}), false);
212
+ });
213
+ (0, mocha_1.it)('no modifica las caches', () => {
214
+ var antes = JSON.stringify(tableContent);
215
+ (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211');
216
+ assert.strictEqual(JSON.stringify(tableContent), antes);
217
+ });
218
+ (0, mocha_1.it)('si las caches no se cargaron devuelve listas vacías', () => {
219
+ assert.deepStrictEqual((0, procedures_dmencu_1.reasNoReasDelOperativo)({}, 'etoi211'), { noReas: [], noReasSup: [], reas: [], reasSup: [] });
220
+ });
221
+ });
222
+ (0, mocha_1.describe)('de punta a punta: modificar una rea llega a la estructura del dispositivo', () => {
223
+ (0, mocha_1.it)('después de guardar una rea, la estructura del operativo la incluye compilada', () => __awaiter(void 0, void 0, void 0, function* () {
224
+ var be = (0, app_para_tests_1.crearAppParaTests)();
225
+ var base = baseConDatos();
226
+ yield be.refreshCaches(base);
227
+ var timestampAnterior = be.caches.timestampEstructura;
228
+ var nuevaRea = { operativo: 'etoi211', rea: 3, descripcion: 'nueva', condicion: 'v4 = 2', orden: 3, es_positiva: true, tarea: null };
229
+ var guardar = (_context, _parameters) => __awaiter(void 0, void 0, void 0, function* () {
230
+ base.tablas.rea = [...reas, nuevaRea];
231
+ return 'ok';
232
+ });
233
+ yield new Promise(resolve => setTimeout(resolve, 2));
234
+ yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: base }, { table: 'rea' });
235
+ assert.ok(be.caches.timestampEstructura > timestampAnterior, 'los dispositivos deben recibir la estructura nueva');
236
+ var reasOP1 = (0, procedures_dmencu_1.reasNoReasDelOperativo)(be.caches.tableContent, 'etoi211').reas;
237
+ assert.deepStrictEqual(reasOP1.map(rea => rea.rea), [1, 2, 3]);
238
+ assert.strictEqual(evaluar(reasOP1[2].condicion_js, { v4: 2 }), true);
239
+ }));
240
+ });
241
+ });
242
+ });
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYWNoZXMtcmVhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdC1jYWNoZXMtcmVhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsaUNBQXFDO0lBRXJDLHNDQUF1QztJQUV2QyxxREFBeUg7SUFDekgsbUVBQXFFO0lBQ3JFLHVFQUFtRTtJQUVuRSxxREFBcUQ7SUFFckQsc0dBQXNHO0lBQ3RHLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUlyRSw4RUFBOEU7SUFDOUUsTUFBTSxTQUFTO1FBRVgsWUFBbUIsTUFBbUM7WUFBbkMsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7WUFEdEQsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUNpQyxDQUFDO1FBQzNELEtBQUssQ0FBQyxHQUFXOztZQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxHQUFHLE1BQUEsTUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQ0FBRyxDQUFDLENBQUMsbUNBQUksRUFBRSxDQUFDO1lBQzlDLElBQUksS0FBSyxHQUFHLE1BQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQUksRUFBRSxDQUFDO1lBQ3JDLElBQUksMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLFVBQVUsR0FBRyxNQUFBLE1BQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsMENBQUcsQ0FBQyxDQUFDLG1DQUFJLE9BQU8sQ0FBQztnQkFDMUQsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FB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QUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcblxuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0Jyk7XG5cbmltcG9ydCB7IENsaWVudGVEYiwgQ29uc3VsdGFEYiwgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEsIFJlZnJlc2NhZG9yRXN0cnVjdHVyYSB9IGZyb20gJy4uL3NlcnZlci9hcHAtZG1lbmN1JztcbmltcG9ydCB7IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8gfSBmcm9tICcuLi9zZXJ2ZXIvcHJvY2VkdXJlcy1kbWVuY3UnO1xuaW1wb3J0IHsgaGVscGVyc0Nhc2lsbGVyb3MgfSBmcm9tICcuLi91bmxvZ2dlZC9oZWxwZXJzLWNhc2lsbGVyb3MnO1xuaW1wb3J0IHR5cGUgeyBOb1JlYSwgTm9SZWFTdXAsIFJlYSwgUmVhU3VwLCBWYWxvciB9IGZyb20gJy4uL3VubG9nZ2VkL3RpcG9zJztcbmltcG9ydCB7IGNyZWFyQXBwUGFyYVRlc3RzIH0gZnJvbSAnLi9hcHAtcGFyYS10ZXN0cyc7XG5cbi8vIHNlIGxpc3RhbiBhY8OhICh5IG5vIHNlIGltcG9ydGEgVEFCTEFTX1JFQV9OT19SRUEpIHBhcmEgcXVlIGVsIHRlc3QgZmFsbGUgc2kgYWxndW5hIGRlamEgZGUgdHJhdGFyc2VcbmNvbnN0IFRBQkxBU19SRUFfTk9fUkVBID0gWydyZWEnLCAnbm9fcmVhJywgJ3JlYV9zdXAnLCAnbm9fcmVhX3N1cCddO1xuXG50eXBlIEZpbGEgPSB7IFtjYW1wbzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCBGaWxhW10gfTtcblxuLy8gQmFzZSBkZSBkYXRvcyBlbiBtZW1vcmlhOiBjYWRhIGNvbnN1bHRhIHNlIHJlc3VlbHZlIHBvciBsYSB0YWJsYSBkZWwgXCJmcm9tXCJcbmNsYXNzIEJhc2VGYWxzYSBpbXBsZW1lbnRzIENsaWVudGVEYiB7XG4gICAgY29uc3VsdGFzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0YWJsYXM6IHsgW3RhYmxhOiBzdHJpbmddOiBGaWxhW10gfSkgeyB9XG4gICAgcXVlcnkoc3FsOiBzdHJpbmcpOiBDb25zdWx0YURiIHtcbiAgICAgICAgdGhpcy5jb25zdWx0YXMucHVzaChzcWwpO1xuICAgICAgICB2YXIgdGFibGEgPSAvZnJvbSAoXFx3KykvLmV4ZWMoc3FsKT8uWzFdID8/ICcnO1xuICAgICAgICB2YXIgZmlsYXMgPSB0aGlzLnRhYmxhc1t0YWJsYV0gPz8gW107XG4gICAgICAgIGlmICgvZ3JvdXAgYnkgZ3J1cG8wPyhfc3VwKT8gLy50ZXN0KHNxbCArICcgJykpIHtcbiAgICAgICAgICAgIHZhciBjYW1wb0dydXBvID0gL3NlbGVjdCAoXFx3KykvLmV4ZWMoc3FsKT8uWzFdID8/ICdncnVwbyc7XG4gICAgICAgICAgICB2YXIgYWxpYXMgPSAvYXMgZ3J1cG8sLy50ZXN0KHNxbCkgPyAnZ3J1cG8nIDogY2FtcG9HcnVwbztcbiAgICAgICAgICAgIHZhciBncnVwb3M6IHsgW2dydXBvOiBzdHJpbmddOiBGaWxhW10gfSA9IHt9O1xuICAgICAgICAgICAgZmlsYXMuZm9yRWFjaChmaWxhID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgZ3J1cG8gPSBTdHJpbmcoZmlsYVtjYW1wb0dydXBvXSk7XG4gICAgICAgICAgICAgICAgZ3J1cG9zW2dydXBvXSA9IGdydXBvc1tncnVwb10gfHwgW107XG4gICAgICAgICAgICAgICAgZ3J1cG9zW2dydXBvXS5wdXNoKGZpbGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWxhcyA9IE9iamVjdC5rZXlzKGdydXBvcykuc29ydCgpLm1hcChncnVwbyA9PiAoeyBbYWxpYXNdOiBncnVwbywgY29kaWdvczogZ3J1cG9zW2dydXBvXSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZldGNoQWxsOiBhc3luYyAoKSA9PiAoeyByb3dDb3VudDogZmlsYXMubGVuZ3RoLCByb3dzOiBmaWxhcywgZmllbGRzOiBbXSB9KSxcbiAgICAgICAgICAgIGZldGNoVW5pcXVlUm93OiBhc3luYyAoKSA9PiAoeyByb3dDb3VudDogMSwgcm93OiBmaWxhc1swXSwgZmllbGRzOiBbXSB9KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNvbnN0IG5vUmVhczogTm9SZWFbXSA9IFtcbiAgICB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCBub19yZWE6IDEsIGRlc2NyaXBjaW9uOiAnYXVzZW50ZScsIGdydXBvOiAnYXVzZW5jaWEnLCB2YXJpYWJsZTogJ3YxJywgdmFsb3I6ICc3JywgZ3J1cG8wOiAnZW5jdWVzdGFibGUnLCBvcmRlbjogMSB9LFxuICAgIHsgb3BlcmF0aXZvOiAnZXRvaTIxMScsIG5vX3JlYTogMiwgZGVzY3JpcGNpb246ICdyZWNoYXpvJywgZ3J1cG86ICdyZWNoYXpvJywgdmFyaWFibGU6ICd2MScsIHZhbG9yOiAnOCcsIGdydXBvMDogJ2VuY3Vlc3RhYmxlJywgb3JkZW46IDIgfSxcbiAgICB7IG9wZXJhdGl2bzogJ2VhaDIwMjInLCBub19yZWE6IDEsIGRlc2NyaXBjaW9uOiAnZGVzaGFiaXRhZGEnLCBncnVwbzogJ25vIGVuY3Vlc3RhYmxlJywgdmFyaWFibGU6ICd2MScsIHZhbG9yOiAnOScsIGdydXBvMDogJ25vIGVuY3Vlc3RhYmxlJywgb3JkZW46IDEgfSxcbl07XG5jb25zdCBub1JlYXNTdXA6IE5vUmVhU3VwW10gPSBbXG4gICAgeyBvcGVyYXRpdm86ICdldG9pMjExJywgbm9fcmVhX3N1cDogNzEsIGRlc2Nfbm9yZWFfc3VwOiAnbm8gY29udGFjdG8nLCBncnVwb19zdXA6ICdzaW4gY29udGFjdG8nLCB2YXJpYWJsZV9zdXA6ICdzMScsIHZhbG9yX3N1cDogJzInLCBncnVwbzBfc3VwOiAnc3VwJywgb3JkZW46IDEgfSxcbiAgICB7IG9wZXJhdGl2bzogJ2VhaDIwMjInLCBub19yZWFfc3VwOiA3MiwgZGVzY19ub3JlYV9zdXA6ICdvdHJvJywgZ3J1cG9fc3VwOiAnb3RybycsIHZhcmlhYmxlX3N1cDogJ3MxJywgdmFsb3Jfc3VwOiAnMycsIGdydXBvMF9zdXA6ICdzdXAnLCBvcmRlbjogMSB9LFxuXTtcbmNvbnN0IHJlYXM6IE9taXQ8UmVhLCAnY29uZGljaW9uX2pzJz5bXSA9IFtcbiAgICB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCByZWE6IDEsIGRlc2NyaXBjaW9uOiAnY29tcGxldGEnLCBjb25kaWNpb246ICd2MSA9IDEgYW5kIHYyID4gMTAnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG4gICAgeyBvcGVyYXRpdm86ICdldG9pMjExJywgcmVhOiAyLCBkZXNjcmlwY2lvbjogJ2luY29tcGxldGEnLCBjb25kaWNpb246ICd2MSA9IDEnLCBvcmRlbjogMiwgZXNfcG9zaXRpdmE6IGZhbHNlLCB0YXJlYTogJ2VuY3UnIH0sXG4gICAgeyBvcGVyYXRpdm86ICdlYWgyMDIyJywgcmVhOiAxLCBkZXNjcmlwY2lvbjogJ290cmEnLCBjb25kaWNpb246ICd2MyA9IDUnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG5dO1xuY29uc3QgcmVhc1N1cDogT21pdDxSZWFTdXAsICdjb25kaWNpb25fanMnPltdID0gW1xuICAgIHsgb3BlcmF0aXZvOiAnZXRvaTIxMScsIHJlYV9zdXA6IDEsIGRlc2NyaXBjaW9uOiAnc3VwZXJ2aXNhZGEnLCBjb25kaWNpb246ICdzMSA9IDEnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiAnc3VwZScgfSxcbl07XG5jb25zdCBvcGVyYXRpdm9zOiBGaWxhW10gPSBbeyBjb25fcmVhX2hvZ2FyOiB0cnVlLCBvcGVyYXRpdm86ICdldG9pMjExJywgY29uZmlnX3NvcnRlbzogbnVsbCB9XTtcblxuZnVuY3Rpb24gYmFzZUNvbkRhdG9zKCkge1xuICAgIHJldHVybiBuZXcgQmFzZUZhbHNhKHsgbm9fcmVhOiBub1JlYXMsIHJlYTogcmVhcywgbm9fcmVhX3N1cDogbm9SZWFzU3VwLCByZWFfc3VwOiByZWFzU3VwLCBvcGVyYXRpdm9zIH0pO1xufVxuXG4vLyBldmFsw7phIHVuYSBjb25kaWNpw7NuIGNvbXBpbGFkYSAoY29uZGljaW9uX2pzKSBjb21vIGxvIGhhY2UgZWwgZGlzcG9zaXRpdm9cbmZ1bmN0aW9uIGV2YWx1YXIoY29uZGljaW9uSnM6IHN0cmluZywgdmFsb3JlczogUmVjb3JkPHN0cmluZywgVmFsb3I+KTogYm9vbGVhbiB7XG4gICAgdmFyIGZ1bmNpb24gPSBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJyArIGNvbmRpY2lvbkpzKTtcbiAgICByZXR1cm4gZnVuY2lvbih2YWxvcmVzLCBoZWxwZXJzQ2FzaWxsZXJvcyk7XG59XG5cbmRlc2NyaWJlKCdkbWVuY3UgLSBjYWNoZXMgZGUgcmVhL25vIHJlYScsICgpID0+IHtcblxuICAgIGRlc2NyaWJlKCdyZWZyZXNoQ2FjaGVzJywgKCkgPT4ge1xuICAgICAgICBpdCgnY2FyZ2EgcmVhLCBubyByZWEgeSBzdXMgdmVyc2lvbmVzIF9zdXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYmUgPSBjcmVhckFwcFBhcmFUZXN0cygpO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlQ29uRGF0b3MoKSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLCBub1JlYXMpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChiZS5jYWNoZXMudGFibGVDb250ZW50LnJlYSwgcmVhcyk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX3N1cCwgbm9SZWFzU3VwKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5yZWFfc3VwLCByZWFzU3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwaWRlIGEgbGEgYmFzZSBsYXMgbGlzdGFzIG9yZGVuYWRhcyBwb3Igb3BlcmF0aXZvIHkgb3JkZW4gKGRlZmluZSBsYSBwcmlvcmlkYWQgZGUgZXZhbHVhY2nDs24pJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgZm9yICh2YXIgdGFibGEgb2YgVEFCTEFTX1JFQV9OT19SRUEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uc3VsdGEgPSBiYXNlLmNvbnN1bHRhcy5maW5kKHNxbCA9PiBuZXcgUmVnRXhwKGBmcm9tICR7dGFibGF9IG9yZGVyIGJ5YCkudGVzdChzcWwpKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQub2soY29uc3VsdGEsIGBubyBzZSBjb25zdWx0w7MgJHt0YWJsYX1gKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQubWF0Y2goY29uc3VsdGEsIG5ldyBSZWdFeHAoYG9yZGVyIGJ5IG9wZXJhdGl2bywgb3JkZW4sICR7dGFibGF9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2FncnVwYSBsb3Mgbm8gcmVhIHBvciBncnVwbyB5IHBvciBncnVwbzAnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYmUgPSBjcmVhckFwcFBhcmFUZXN0cygpO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlQ29uRGF0b3MoKSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgICAgICAgIGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3Vwcy5tYXAoKGc6IEZpbGEpID0+IGcuZ3J1cG8pLFxuICAgICAgICAgICAgICAgIFsnYXVzZW5jaWEnLCAnbm8gZW5jdWVzdGFibGUnLCAncmVjaGF6byddXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICAgICAgICBiZS5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMwLm1hcCgoZzogRmlsYSkgPT4gZy5ncnVwbyksXG4gICAgICAgICAgICAgICAgWydlbmN1ZXN0YWJsZScsICdubyBlbmN1ZXN0YWJsZSddXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2NhcmdhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBvcGVyYXRpdm8gYWN0dWFsIChjb25fcmVhX2hvZ2FyKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHZhciBiZSA9IGNyZWFyQXBwUGFyYVRlc3RzKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2VDb25EYXRvcygpKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhciwgb3BlcmF0aXZvc1swXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnYWwgcmVjYXJnYXIgcmVlbXBsYXphIGxvcyBkYXRvcyBhbnRlcmlvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgYmFzZS50YWJsYXMucmVhID0gW3JlYXNbMF1dO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5yZWEsIFtyZWFzWzBdXSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3JlZnJlc2NhckVzdHJ1Y3R1cmFBbE1vZGlmaWNhclRhYmxhIChlbnZ1ZWx2ZSB0YWJsZV9yZWNvcmRfc2F2ZSB5IHRhYmxlX3JlY29yZF9kZWxldGUpJywgKCkgPT4ge1xuICAgICAgICB0eXBlIENvbnRleHRvRmFsc28gPSB7IGNsaWVudDogQ2xpZW50ZURiIH07XG4gICAgICAgIHR5cGUgTGxhbWFkYSA9IHsgdGFibGE6IHN0cmluZywgZXh0cmE6IG9iamVjdCB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHByZXBhcmFyUmVmcmVzY2Fkb3IoKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRvczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIHZhciBjbGllbnRlc1JlZnJlc2NhZG9zOiBDbGllbnRlRGJbXSA9IFtdO1xuICAgICAgICAgICAgdmFyIGJlOiBSZWZyZXNjYWRvckVzdHJ1Y3R1cmEgPSB7XG4gICAgICAgICAgICAgICAgY2FjaGVzOiB7IHRpbWVzdGFtcEVzdHJ1Y3R1cmE6IDAgfSxcbiAgICAgICAgICAgICAgICByZWZyZXNoQ2FjaGVzOiBhc3luYyAoY2xpZW50OiBDbGllbnRlRGIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRvcy5wdXNoKCdyZWZyZXNjYXInKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50ZXNSZWZyZXNjYWRvcy5wdXNoKGNsaWVudCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgbGxhbWFkYXM6IExsYW1hZGFbXSA9IFtdO1xuICAgICAgICAgICAgdmFyIGd1YXJkYXIgPSBhc3luYyAoX2NvbnRleHQ6IENvbnRleHRvRmFsc28sIHBhcmFtZXRlcnM6IHsgdGFibGU6IHN0cmluZyB9LCBleHRyYT86IG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50b3MucHVzaCgnZ3VhcmRhcicpO1xuICAgICAgICAgICAgICAgIGxsYW1hZGFzLnB1c2goeyB0YWJsYTogcGFyYW1ldGVycy50YWJsZSwgZXh0cmEgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZ3VhcmRhZG86IHBhcmFtZXRlcnMudGFibGUgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZSwgZXZlbnRvcywgY2xpZW50ZXNSZWZyZXNjYWRvcywgbGxhbWFkYXMsIGd1YXJkYXIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdGFibGEgb2YgVEFCTEFTX1JFQV9OT19SRUEpIHtcbiAgICAgICAgICAgIGl0KGBhbCBtb2RpZmljYXIgJHt0YWJsYX0gcmVjYXJnYSBsYXMgY2FjaGVzIGRlc3B1w6lzIGRlIGd1YXJkYXIgeSBjYW1iaWEgbGEgZXN0cnVjdHVyYWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcywgY2xpZW50ZXNSZWZyZXNjYWRvcywgZ3VhcmRhciB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgQmFzZUZhbHNhKHt9KTtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0YWRvID0gYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50IH0sIHsgdGFibGU6IHRhYmxhIH0pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGd1YXJkYWRvOiB0YWJsYSB9KTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGV2ZW50b3MsIFsnZ3VhcmRhcicsICdyZWZyZXNjYXInXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNsaWVudGVzUmVmcmVzY2Fkb3NbMF0sIGNsaWVudCwgJ2RlYmUgcmVjYXJnYXIgY29uIGVsIG1pc21vIGNsaWVudGUgKG1pc21hIHRyYW5zYWNjacOzbiknKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQub2soYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPiAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdGFibGEgb2YgWydjYXNpbGxlcm9zJywgJ3NlbWFuYXMnXSkge1xuICAgICAgICAgICAgaXQoYGFsIG1vZGlmaWNhciAke3RhYmxhfSBjYW1iaWEgbGEgZXN0cnVjdHVyYSBzaW4gcmVjYXJnYXIgbGFzIGNhY2hlcyBkZSByZWFgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIHsgYmUsIGV2ZW50b3MsIGd1YXJkYXIgfSA9IHByZXBhcmFyUmVmcmVzY2Fkb3IoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYShiZSwgZ3VhcmRhcikoeyBjbGllbnQ6IG5ldyBCYXNlRmFsc2Eoe30pIH0sIHsgdGFibGU6IHRhYmxhIH0pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXZlbnRvcywgWydndWFyZGFyJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5vayhiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSA+IDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaXQoJ2FsIG1vZGlmaWNhciBvdHJhcyB0YWJsYXMgbm8gdG9jYSBsYSBlc3RydWN0dXJhIG5pIGxhcyBjYWNoZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcywgZ3VhcmRhciB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50OiBuZXcgQmFzZUZhbHNhKHt9KSB9LCB7IHRhYmxlOiAndXN1YXJpb3MnIH0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChldmVudG9zLCBbJ2d1YXJkYXInXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEsIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3NpIGZhbGxhIGVsIGd1YXJkYWRvIG5vIHJlY2FyZ2EgbmkgY2FtYmlhIGxhIGVzdHJ1Y3R1cmEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcyB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgdmFyIGd1YXJkYXJDb25FcnJvciA9IGFzeW5jIChfY29udGV4dDogQ29udGV4dG9GYWxzbywgX3BhcmFtZXRlcnM6IHsgdGFibGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnRvcy5wdXNoKCdndWFyZGFyJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBhbCBndWFyZGFyJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgICAgICAgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXJDb25FcnJvcikoeyBjbGllbnQ6IG5ldyBCYXNlRmFsc2Eoe30pIH0sIHsgdGFibGU6ICdyZWEnIH0pLFxuICAgICAgICAgICAgICAgIC9lcnJvciBhbCBndWFyZGFyL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXZlbnRvcywgWydndWFyZGFyJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJlLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwYXNhIGEgbGEgZnVuY2nDs24gb3JpZ2luYWwgbG9zIGFyZ3VtZW50b3MgZXh0cmEgKGZpbGVzL29wdHMgZGUgdGFibGVfcmVjb3JkX3NhdmUpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgYmUsIGxsYW1hZGFzLCBndWFyZGFyIH0gPSBwcmVwYXJhclJlZnJlc2NhZG9yKCk7XG4gICAgICAgICAgICB2YXIgZXh0cmEgPSB7IGZpbGVzOiBbXSB9O1xuICAgICAgICAgICAgYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50OiBuZXcgQmFzZUZhbHNhKHt9KSB9LCB7IHRhYmxlOiAnbm9fcmVhJyB9LCBleHRyYSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobGxhbWFkYXNbMF0uZXh0cmEsIGV4dHJhKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncmVhc05vUmVhc0RlbE9wZXJhdGl2byAocmVhL25vIHJlYSBlbiBsYSBlc3RydWN0dXJhIHF1ZSByZWNpYmUgZWwgZGlzcG9zaXRpdm8pJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRlbnQgPSB7IG5vX3JlYTogbm9SZWFzLCBub19yZWFfc3VwOiBub1JlYXNTdXAsIHJlYTogcmVhcywgcmVhX3N1cDogcmVhc1N1cCB9O1xuXG4gICAgICAgIGl0KCdmaWx0cmEgY2FkYSBsaXN0YSBwb3Igb3BlcmF0aXZvJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHJlc3VsdGFkbyA9IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8odGFibGVDb250ZW50LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ubm9SZWFzLCBbbm9SZWFzWzBdLCBub1JlYXNbMV1dKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLm5vUmVhc1N1cCwgW25vUmVhc1N1cFswXV0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhcy5tYXAocmVhID0+IHJlYS5yZWEpLCBbMSwgMl0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhc1N1cC5tYXAocmVhU3VwID0+IHJlYVN1cC5yZWFfc3VwKSwgWzFdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdjb25zZXJ2YSBlbCBvcmRlbiBkZSBsYXMgY2FjaGVzIChxdWUgdmllbmUgb3JkZW5hZG8gcG9yIG9yZGVuKScsICgpID0+IHtcbiAgICAgICAgICAgIHZhciByZXN1bHRhZG8gPSByZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHsgLi4udGFibGVDb250ZW50LCByZWE6IFtyZWFzWzFdLCByZWFzWzBdXSB9LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhcy5tYXAocmVhID0+IHJlYS5yZWEpLCBbMiwgMV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2NvbXBpbGEgbGFzIGNvbmRpY2lvbmVzIGRlIHJlYSBhIGpzIGV2YWx1YWJsZSBlbiBlbCBkaXNwb3NpdGl2bycsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBbY29tcGxldGEsIGluY29tcGxldGFdID0gcmVhc05vUmVhc0RlbE9wZXJhdGl2byh0YWJsZUNvbnRlbnQsICdldG9pMjExJykucmVhcztcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGNvbXBsZXRhLmNvbmRpY2lvbl9qcywgeyB2MTogMSwgdjI6IDExIH0pLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGNvbXBsZXRhLmNvbmRpY2lvbl9qcywgeyB2MTogMSwgdjI6IDUgfSksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGluY29tcGxldGEuY29uZGljaW9uX2pzLCB7IHYxOiAxIH0pLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGluY29tcGxldGEuY29uZGljaW9uX2pzLCB7IHYxOiAyIH0pLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnY29tcGlsYSBsYXMgY29uZGljaW9uZXMgZGUgcmVhX3N1cCcsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBbc3VwZXJ2aXNhZGFdID0gcmVhc05vUmVhc0RlbE9wZXJhdGl2byh0YWJsZUNvbnRlbnQsICdldG9pMjExJykucmVhc1N1cDtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKHN1cGVydmlzYWRhLmNvbmRpY2lvbl9qcywgeyBzMTogMSB9KSwgdHJ1ZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXZhbHVhcihzdXBlcnZpc2FkYS5jb25kaWNpb25fanMsIHsgczE6IDIgfSksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdsYXMgdmFyaWFibGVzIHNpbiBjYXJnYXIgc2UgdG9tYW4gY29tbyAwIChubyByb21wZW4gbGEgZXZhbHVhY2nDs24pJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIFtjb21wbGV0YV0gPSByZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHRhYmxlQ29udGVudCwgJ2V0b2kyMTEnKS5yZWFzO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV2YWx1YXIoY29tcGxldGEuY29uZGljaW9uX2pzLCB7fSksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdubyBtb2RpZmljYSBsYXMgY2FjaGVzJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGFudGVzID0gSlNPTi5zdHJpbmdpZnkodGFibGVDb250ZW50KTtcbiAgICAgICAgICAgIHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8odGFibGVDb250ZW50LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKEpTT04uc3RyaW5naWZ5KHRhYmxlQ29udGVudCksIGFudGVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaSBsYXMgY2FjaGVzIG5vIHNlIGNhcmdhcm9uIGRldnVlbHZlIGxpc3RhcyB2YWPDrWFzJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHt9LCAnZXRvaTIxMScpLCB7IG5vUmVhczogW10sIG5vUmVhc1N1cDogW10sIHJlYXM6IFtdLCByZWFzU3VwOiBbXSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZGUgcHVudGEgYSBwdW50YTogbW9kaWZpY2FyIHVuYSByZWEgbGxlZ2EgYSBsYSBlc3RydWN0dXJhIGRlbCBkaXNwb3NpdGl2bycsICgpID0+IHtcbiAgICAgICAgaXQoJ2Rlc3B1w6lzIGRlIGd1YXJkYXIgdW5hIHJlYSwgbGEgZXN0cnVjdHVyYSBkZWwgb3BlcmF0aXZvIGxhIGluY2x1eWUgY29tcGlsYWRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgdmFyIHRpbWVzdGFtcEFudGVyaW9yID0gYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmE7XG4gICAgICAgICAgICB2YXIgbnVldmFSZWE6IE9taXQ8UmVhLCAnY29uZGljaW9uX2pzJz4gPSB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCByZWE6IDMsIGRlc2NyaXBjaW9uOiAnbnVldmEnLCBjb25kaWNpb246ICd2NCA9IDInLCBvcmRlbjogMywgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH07XG4gICAgICAgICAgICB2YXIgZ3VhcmRhciA9IGFzeW5jIChfY29udGV4dDogeyBjbGllbnQ6IENsaWVudGVEYiB9LCBfcGFyYW1ldGVyczogeyB0YWJsZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICBiYXNlLnRhYmxhcy5yZWEgPSBbLi4ucmVhcywgbnVldmFSZWFdO1xuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyKSk7XG4gICAgICAgICAgICBhd2FpdCByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYShiZSwgZ3VhcmRhcikoeyBjbGllbnQ6IGJhc2UgfSwgeyB0YWJsZTogJ3JlYScgfSk7XG4gICAgICAgICAgICBhc3NlcnQub2soYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPiB0aW1lc3RhbXBBbnRlcmlvciwgJ2xvcyBkaXNwb3NpdGl2b3MgZGViZW4gcmVjaWJpciBsYSBlc3RydWN0dXJhIG51ZXZhJyk7XG4gICAgICAgICAgICB2YXIgcmVhc09QMSA9IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8oYmUuY2FjaGVzLnRhYmxlQ29udGVudCwgJ2V0b2kyMTEnKS5yZWFzO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWFzT1AxLm1hcChyZWEgPT4gcmVhLnJlYSksIFsxLCAyLCAzXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXZhbHVhcihyZWFzT1AxWzJdLmNvbmRpY2lvbl9qcywgeyB2NDogMiB9KSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};