dmencu 0.1.53 → 0.2.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.
- package/dist/client/unlogged/render-formulario.tsx +21 -1
- package/dist/client/unlogged/tipos.d.ts +9 -2
- package/dist/client/unlogged/tipos.js +1 -1
- package/dist/server/server/app-dmencu.d.ts +4 -0
- package/dist/server/server/table-acciones.d.ts +3 -0
- package/dist/server/server/table-acciones.js +55 -0
- package/dist/server/server/table-estados.d.ts +3 -0
- package/dist/server/server/table-estados.js +51 -0
- package/dist/server/server/table-estados_acciones.d.ts +3 -0
- package/dist/server/server/table-estados_acciones.js +43 -0
- package/dist/server/server/table-mis_tareas_tem copy.d.ts +3 -0
- package/dist/server/server/table-mis_tareas_tem copy.js +19 -0
- package/dist/server/server/table-tareas_tem copy.d.ts +3 -0
- package/dist/server/server/table-tareas_tem copy.js +176 -0
- package/dist/server/server/table-tareas_tem disponibles.d.ts +3 -0
- package/dist/server/server/table-tareas_tem disponibles.js +19 -0
- package/dist/server/server/table-tareas_tem_asignables copy.d.ts +3 -0
- package/dist/server/server/table-tareas_tem_asignables copy.js +24 -0
- package/dist/server/server/table-tareas_tem_asignables.d.ts +5 -0
- package/dist/server/server/table-tareas_tem_asignables.js +53 -0
- package/dist/server/server/table-tareas_tem_disponibles.d.ts +3 -0
- package/dist/server/server/table-tareas_tem_disponibles.js +19 -0
- package/dist/server/server/table-tareas_tem_recepcion.d.ts +3 -0
- package/dist/server/server/table-tareas_tem_recepcion.js +28 -0
- package/dist/server/unlogged/tipos.d.ts +9 -2
- package/dist/server/unlogged/tipos.js +1 -1
- package/dist/unlogged/unlogged/render-formulario.d.ts +8 -1
- package/dist/unlogged/unlogged/render-formulario.js +9 -3
- package/dist/unlogged/unlogged/render-formulario.tsx +21 -1
- package/dist/unlogged/unlogged/tipos.d.ts +9 -2
- package/dist/unlogged/unlogged/tipos.js +1 -1
- package/install/esquema_comun.sql +2 -2
- package/install/{metadatos/tipoc.tab → tipoc.tab} +14 -12
- package/install/{metadatos/tipoc_tipoc.tab → tipoc_tipoc.tab} +24 -22
- package/package.json +1 -1
- package/dist/client/client/carga-dm/dm-manifest.manifest +0 -70
- package/dist/client/client/css/etiquetas-qr.styl +0 -84
- package/dist/client/client/service-worker.js +0 -114
- package/dist/client/unlogged/digitov.js +0 -59
- package/dist/client/unlogged/generador-qr.js +0 -60
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
- package/dist/client/unlogged/img/_login-logo-icon.png +0 -0
- package/dist/client/unlogged/img/_logo-128.png +0 -0
- package/dist/client/unlogged/img/_logo.png +0 -0
- package/dist/server/server/app-dmencu.ts.BASE.js +0 -580
- package/dist/server/server/app-dmencu.ts.LOCAL.js +0 -598
- package/dist/server/server/app-dmencu.ts.REMOTE.js +0 -582
- package/dist/server/server/table-etiquetas.js +0 -48
- package/dist/server/server/table-etiquetas_resultado.js +0 -113
- package/dist/server/server/table-etiquetas_resultado_plus.js +0 -19
- package/dist/server/server/table-mis_relevadores.js +0 -78
- package/dist/server/server/table-planchas.js +0 -38
- package/dist/server/server/table-relevadores.js +0 -19
- package/dist/server/server/table-resultados-test.js +0 -37
- package/dist/unlogged/unlogged/consola-errores.js +0 -25
- package/dist/unlogged/unlogged/digitov.js +0 -59
- package/dist/unlogged/unlogged/generador-qr.js +0 -60
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
- package/dist/unlogged/unlogged/img/_login-logo-icon.png +0 -0
- package/dist/unlogged/unlogged/img/_logo-128.png +0 -0
- package/dist/unlogged/unlogged/img/_logo.png +0 -0
|
@@ -1,598 +0,0 @@
|
|
|
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", "./procedures-dmencu", "pg-promise-strict", "mini-tools", "yazl", "like-ar", "fs", "./table-roles", "./table-personal", "./table-recepcionistas", "./table-encuestadores", "./table-mis_encuestadores", "./table-recuperadores", "./table-supervisores", "./table-personal_rol", "./table-permisos", "./table-roles_permisos", "./table-parametros", "./table-roles_subordinados", "./table-no_rea", "./table-tem", "./table-tem_recepcion", "./table-semanas", "./table-usuarios", "./table-operaciones", "./table-comunas", "./table-areas", "./table-sincronizaciones", "./table-tareas", "./table-tareas_tem", "./table-tareas_areas", "./table-mis_tareas", "./table-mis_tareas_tem", "./table-mis_tareas_areas", "./table-resultados_tarea", "./table-control_campo", "./table-control_resumen", "./def-config"], factory);
|
|
8
|
-
}
|
|
9
|
-
})(function (require, exports) {
|
|
10
|
-
"use strict";
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.emergeAppDmEncu = void 0;
|
|
13
|
-
const procedures_dmencu_1 = require("./procedures-dmencu");
|
|
14
|
-
const pg = require("pg-promise-strict");
|
|
15
|
-
const miniTools = require("mini-tools");
|
|
16
|
-
const yazl = require("yazl");
|
|
17
|
-
const likeAr = require("like-ar");
|
|
18
|
-
const fs_1 = require("fs");
|
|
19
|
-
const table_roles_1 = require("./table-roles");
|
|
20
|
-
const table_personal_1 = require("./table-personal");
|
|
21
|
-
const table_recepcionistas_1 = require("./table-recepcionistas");
|
|
22
|
-
const table_encuestadores_1 = require("./table-encuestadores");
|
|
23
|
-
const table_mis_encuestadores_1 = require("./table-mis_encuestadores");
|
|
24
|
-
const table_recuperadores_1 = require("./table-recuperadores");
|
|
25
|
-
const table_supervisores_1 = require("./table-supervisores");
|
|
26
|
-
const table_personal_rol_1 = require("./table-personal_rol");
|
|
27
|
-
const table_permisos_1 = require("./table-permisos");
|
|
28
|
-
const table_roles_permisos_1 = require("./table-roles_permisos");
|
|
29
|
-
const table_parametros_1 = require("./table-parametros");
|
|
30
|
-
const table_roles_subordinados_1 = require("./table-roles_subordinados");
|
|
31
|
-
const table_no_rea_1 = require("./table-no_rea");
|
|
32
|
-
const table_tem_1 = require("./table-tem");
|
|
33
|
-
const table_tem_recepcion_1 = require("./table-tem_recepcion");
|
|
34
|
-
const table_semanas_1 = require("./table-semanas");
|
|
35
|
-
const table_usuarios_1 = require("./table-usuarios");
|
|
36
|
-
const table_operaciones_1 = require("./table-operaciones");
|
|
37
|
-
const table_comunas_1 = require("./table-comunas");
|
|
38
|
-
const table_areas_1 = require("./table-areas");
|
|
39
|
-
const table_sincronizaciones_1 = require("./table-sincronizaciones");
|
|
40
|
-
const table_tareas_1 = require("./table-tareas");
|
|
41
|
-
const table_tareas_tem_1 = require("./table-tareas_tem");
|
|
42
|
-
const table_tareas_areas_1 = require("./table-tareas_areas");
|
|
43
|
-
const table_mis_tareas_1 = require("./table-mis_tareas");
|
|
44
|
-
const table_mis_tareas_tem_1 = require("./table-mis_tareas_tem");
|
|
45
|
-
const table_mis_tareas_areas_1 = require("./table-mis_tareas_areas");
|
|
46
|
-
const table_resultados_tarea_1 = require("./table-resultados_tarea");
|
|
47
|
-
const table_control_campo_1 = require("./table-control_campo");
|
|
48
|
-
const table_control_resumen_1 = require("./table-control_resumen");
|
|
49
|
-
const def_config_1 = require("./def-config");
|
|
50
|
-
const APP_DM_VERSION = "#22-04-04b";
|
|
51
|
-
function emergeAppDmEncu(Base) {
|
|
52
|
-
return class AppDmEncu extends Base {
|
|
53
|
-
constructor(...args) {
|
|
54
|
-
super(args);
|
|
55
|
-
this.caches.tableContent = this.caches.tableContent || {};
|
|
56
|
-
this.caches.tableContent.no_rea = [];
|
|
57
|
-
this.caches.tableContent.no_rea_groups = [];
|
|
58
|
-
this.metaEncIncluirCasillerosSaltoREL = false;
|
|
59
|
-
this.timestampEstructura = new Date().getTime();
|
|
60
|
-
}
|
|
61
|
-
async getProcedures() {
|
|
62
|
-
var be = this;
|
|
63
|
-
var procedimientoAReemplazar = ["caso_guardar", "caso_traer"];
|
|
64
|
-
var parentProc = await super.getProcedures();
|
|
65
|
-
parentProc = parentProc.filter((procedure) => !procedimientoAReemplazar.includes(procedure.action));
|
|
66
|
-
parentProc = parentProc.map(procDef => {
|
|
67
|
-
if (procDef.action == 'table_record_save' || procDef.action == 'table_record_delete') {
|
|
68
|
-
var coreFunctionInterno = procDef.coreFunction;
|
|
69
|
-
procDef.coreFunction = async function (context, parameters) {
|
|
70
|
-
var result = await coreFunctionInterno(context, parameters);
|
|
71
|
-
if (parameters.table == 'casilleros') {
|
|
72
|
-
be.timestampEstructura = new Date().getTime();
|
|
73
|
-
console.log('se tocó la estructura', be.timestampEstructura);
|
|
74
|
-
}
|
|
75
|
-
return result;
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
return procDef;
|
|
79
|
-
});
|
|
80
|
-
return parentProc.concat(procedures_dmencu_1.ProceduresDmEncu);
|
|
81
|
-
}
|
|
82
|
-
async checkDatabaseStructure(_client) {
|
|
83
|
-
}
|
|
84
|
-
addSchrödingerServices(mainApp, baseUrl) {
|
|
85
|
-
let be = this;
|
|
86
|
-
super.addSchrödingerServices(mainApp, baseUrl);
|
|
87
|
-
mainApp.use(function (req, res, next) {
|
|
88
|
-
if (req.session && !req.session.install) {
|
|
89
|
-
req.session.install = Math.random().toString().replace('.', '');
|
|
90
|
-
}
|
|
91
|
-
next();
|
|
92
|
-
});
|
|
93
|
-
mainApp.get(baseUrl + '/campo', async function (req, res, _next) {
|
|
94
|
-
// @ts-ignore sé que voy a recibir useragent por los middlewares de Backend-plus
|
|
95
|
-
var { useragent, user } = req;
|
|
96
|
-
if (user) {
|
|
97
|
-
/** @type {{type:'js', src:string}[]} */
|
|
98
|
-
var webManifestPath = 'carga-dm/web-manifest.webmanifest';
|
|
99
|
-
var htmlMain = be.mainPage({ useragent, user }, false, { skipMenu: true, webManifestPath }).toHtmlDoc();
|
|
100
|
-
miniTools.serveText(htmlMain, 'html')(req, res);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
res.redirect(baseUrl + '/login#w=path&path=/campo');
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
var createServiceWorker = async function () {
|
|
107
|
-
var sw = await fs_1.promises.readFile('node_modules/service-worker-admin/dist/service-worker-wo-manifest.js', 'utf8');
|
|
108
|
-
var manifest = be.createResourcesForCacheJson({});
|
|
109
|
-
var swManifest = sw
|
|
110
|
-
.replace("'/*version*/'", JSON.stringify(manifest.version))
|
|
111
|
-
.replace("'/*appName*/'", JSON.stringify(manifest.appName))
|
|
112
|
-
.replace(/\[\s*\/\*urlsToCache\*\/\s*\]/, JSON.stringify(manifest.cache))
|
|
113
|
-
.replace(/\[\s*\/\*fallbacks\*\/\s*\]/, JSON.stringify(manifest.fallback || []));
|
|
114
|
-
//.replace("/#CACHE$/", "/(a\\d+m\\d+p\\d+t\\d+_estructura.js)|(a\\d+m\\d+p\\d+t\\d+_hdr.json)/");
|
|
115
|
-
return swManifest;
|
|
116
|
-
};
|
|
117
|
-
mainApp.get(baseUrl + `/sw-manifest.js`, async function (req, res, next) {
|
|
118
|
-
try {
|
|
119
|
-
miniTools.serveText(await createServiceWorker(), 'application/javascript')(req, res);
|
|
120
|
-
}
|
|
121
|
-
catch (err) {
|
|
122
|
-
miniTools.serveErr(req, res, next)(err);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
mainApp.get(baseUrl + `/carga-dm/web-manifest.webmanifest`, async function (req, res, next) {
|
|
126
|
-
const APP_NAME = (await be.inTransaction(null, (client) => client.query("select operativo from parametros where unico_registro").fetchUniqueValue())).value;
|
|
127
|
-
try {
|
|
128
|
-
const content = {
|
|
129
|
-
"name": `${APP_NAME} Progressive Web App`,
|
|
130
|
-
"short_name": `${APP_NAME} PWA`,
|
|
131
|
-
"description": `Progressive Web App for ${APP_NAME}.`,
|
|
132
|
-
"icons": [
|
|
133
|
-
{
|
|
134
|
-
"src": `../img/${APP_NAME}-logo-dm-32.png`,
|
|
135
|
-
"sizes": "32x32",
|
|
136
|
-
"type": "image/png"
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
"src": `../img/${APP_NAME}-logo-dm-48.png`,
|
|
140
|
-
"sizes": "48x48",
|
|
141
|
-
"type": "image/png"
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
"src": `../img/${APP_NAME}-logo-dm-64.png`,
|
|
145
|
-
"sizes": "64x64",
|
|
146
|
-
"type": "image/png"
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
"src": `../img/${APP_NAME}-logo-dm-72.png`,
|
|
150
|
-
"sizes": "72x72",
|
|
151
|
-
"type": "image/png"
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
"src": `../img/${APP_NAME}-logo-dm-192.png`,
|
|
155
|
-
"sizes": "192x192",
|
|
156
|
-
"type": "image/png"
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
"src": `../img/${APP_NAME}-logo-dm-512.png`,
|
|
160
|
-
"sizes": "512x512",
|
|
161
|
-
"type": "image/png"
|
|
162
|
-
}
|
|
163
|
-
],
|
|
164
|
-
"start_url": "../campo",
|
|
165
|
-
"display": "standalone",
|
|
166
|
-
"theme_color": "#3F51B5",
|
|
167
|
-
"background_color": "#6d60ed"
|
|
168
|
-
};
|
|
169
|
-
miniTools.serveText(JSON.stringify(content), 'application/json')(req, res);
|
|
170
|
-
}
|
|
171
|
-
catch (err) {
|
|
172
|
-
console.log(err);
|
|
173
|
-
miniTools.serveErr(req, res, next)(err);
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
addLoggedServices() {
|
|
178
|
-
var be = this;
|
|
179
|
-
super.addLoggedServices();
|
|
180
|
-
be.app.get('/manifest.manifest', async function (req, res, next) {
|
|
181
|
-
miniTools.serveFile('src/client/manifest.manifest', {})(req, res);
|
|
182
|
-
});
|
|
183
|
-
this.app.get('/file', async function (req, res) {
|
|
184
|
-
let result = await be.inTransaction(req, (client) => client.query("select ruta from adjuntos where id_adjunto = $1", [req.query.id_adjunto])
|
|
185
|
-
.fetchUniqueValue());
|
|
186
|
-
var path = result.value;
|
|
187
|
-
miniTools.serveFile(path, {})(req, res);
|
|
188
|
-
});
|
|
189
|
-
this.app.get('/imagenes', async function (req, res) {
|
|
190
|
-
miniTools.serveFile('local-images/' + req.query.pdf, {})(req, res);
|
|
191
|
-
});
|
|
192
|
-
this.app.get('/download/all', async function (req, res, next) {
|
|
193
|
-
if (req.user == null || req.user.rol != 'admin') {
|
|
194
|
-
console.log('no está autorizado a bajarse todo', req.user);
|
|
195
|
-
return next();
|
|
196
|
-
}
|
|
197
|
-
let zip = new yazl.ZipFile();
|
|
198
|
-
zip.outputStream.pipe(res);
|
|
199
|
-
let base = 'local-attachments';
|
|
200
|
-
let files = await fs_1.promises.readdir(base);
|
|
201
|
-
await Promise.all(files.map(async function (fileName) {
|
|
202
|
-
var path = base + '/' + fileName;
|
|
203
|
-
var stat = await fs_1.promises.stat(path);
|
|
204
|
-
if (stat.isFile) {
|
|
205
|
-
zip.addFile(path, fileName);
|
|
206
|
-
}
|
|
207
|
-
}));
|
|
208
|
-
zip.end();
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
async postConfig() {
|
|
212
|
-
await super.postConfig();
|
|
213
|
-
var be = this;
|
|
214
|
-
be.metaEncIncluirCasillerosSaltoREL = false;
|
|
215
|
-
await be.inTransaction(null, async function (client) {
|
|
216
|
-
var qPermisos = `
|
|
217
|
-
SELECT jsonb_object_agg(r.rol,jsonb_build_object('superuser',r.superuser,'puede',(
|
|
218
|
-
SELECT jsonb_object_agg(rp.permiso,(
|
|
219
|
-
SELECT jsonb_object_agg(rpa.accion,rpa.habilitado)
|
|
220
|
-
FROM roles_permisos rpa
|
|
221
|
-
WHERE rpa.rol=rp.rol AND rpa.permiso=rp.permiso
|
|
222
|
-
))
|
|
223
|
-
FROM roles_permisos rp
|
|
224
|
-
WHERE rp.rol=r.rol #condHabilitado#
|
|
225
|
-
)))
|
|
226
|
-
FROM roles r
|
|
227
|
-
`;
|
|
228
|
-
var results = [
|
|
229
|
-
await client.query(qPermisos.replace('#condHabilitado#', '')).fetchUniqueValue(),
|
|
230
|
-
await client.query(qPermisos.replace('#condHabilitado#', ` and rp.${pg.quoteIdent('habilitado')}`)).fetchUniqueValue(),
|
|
231
|
-
await client.query(`
|
|
232
|
-
SELECT jsonb_object_agg(permiso,(
|
|
233
|
-
SELECT jsonb_object_agg(accion,true)
|
|
234
|
-
FROM permisos pa
|
|
235
|
-
WHERE pa.permiso=p.permiso
|
|
236
|
-
))
|
|
237
|
-
FROM permisos p
|
|
238
|
-
`).fetchUniqueValue()
|
|
239
|
-
];
|
|
240
|
-
be.permisosRol = results[0].value;
|
|
241
|
-
be.permisosRolSoloTrue = results[1].value;
|
|
242
|
-
be.permisosSuperuser = results[2].value;
|
|
243
|
-
be.permisosParaNadie = likeAr(be.permisosSuperuser).map(p => likeAr(p).map(va => false).plain()).plain();
|
|
244
|
-
//console.dir(be.permisosRolSoloTrue,{depth:9});
|
|
245
|
-
//console.dir(be.permisosSuperuser,{depth:9});
|
|
246
|
-
//console.dir(be.permisosParaNadie,{depth:9});
|
|
247
|
-
});
|
|
248
|
-
await this.refreshCaches();
|
|
249
|
-
}
|
|
250
|
-
configStaticConfig() {
|
|
251
|
-
super.configStaticConfig();
|
|
252
|
-
this.setStaticConfig(def_config_1.defConfig);
|
|
253
|
-
}
|
|
254
|
-
clientIncludes(req, opts) {
|
|
255
|
-
var be = this;
|
|
256
|
-
var logged = req && opts && !opts.skipMenu;
|
|
257
|
-
var menuedResources = logged ? [
|
|
258
|
-
{ type: 'js', src: 'client/client.js' },
|
|
259
|
-
] : [
|
|
260
|
-
{ type: 'js', src: 'unlogged.js' },
|
|
261
|
-
];
|
|
262
|
-
if (opts && opts.extraFiles) {
|
|
263
|
-
menuedResources = menuedResources.concat(opts.extraFiles);
|
|
264
|
-
}
|
|
265
|
-
var resources = [
|
|
266
|
-
{ type: 'js', module: 'react', modPath: 'umd', fileDevelopment: 'react.development.js', file: 'react.production.min.js' },
|
|
267
|
-
{ type: 'js', module: 'react-dom', modPath: 'umd', fileDevelopment: 'react-dom.development.js', file: 'react-dom.production.min.js' },
|
|
268
|
-
{ type: 'js', module: '@material-ui/core', modPath: 'umd', fileDevelopment: 'material-ui.development.js', file: 'material-ui.production.min.js' },
|
|
269
|
-
{ type: 'js', module: 'clsx', file: 'clsx.min.js' },
|
|
270
|
-
{ type: 'js', module: 'redux', modPath: '../dist', fileDevelopment: 'redux.js', file: 'redux.min.js' },
|
|
271
|
-
{ type: 'js', module: 'react-redux', modPath: '../dist', fileDevelopment: 'react-redux.js', file: 'react-redux.min.js' },
|
|
272
|
-
{ type: 'js', module: 'memoize-one', file: 'memoize-one.js' },
|
|
273
|
-
{ type: 'js', module: 'qrcode', modPath: '../build', file: 'qrcode.js' },
|
|
274
|
-
...super.clientIncludes(req, opts).filter(m => m.file != 'formularios.css')
|
|
275
|
-
.filter(m => logged || true
|
|
276
|
-
//&& m.file!='operativos.js'
|
|
277
|
-
//&& m.file!='meta-enc.js'
|
|
278
|
-
//&& m.file!='datos-ext.js'
|
|
279
|
-
//&& m.file!='consistencias.js'
|
|
280
|
-
&& m.file != 'var-cal.js'
|
|
281
|
-
&& m.file != 'var-cal.js'
|
|
282
|
-
//&& m.file!='varcal.js'
|
|
283
|
-
//)
|
|
284
|
-
//.filter(m=>logged || true
|
|
285
|
-
// && m.file!='operativos.js'
|
|
286
|
-
// && m.file!='meta-enc.js'
|
|
287
|
-
// && m.file!='datos-ext.js'
|
|
288
|
-
// && m.file!='consistencias.js'
|
|
289
|
-
// && m.file!='varcal.js'
|
|
290
|
-
),
|
|
291
|
-
{ type: 'js', module: 'service-worker-admin', file: 'service-worker-admin.js' },
|
|
292
|
-
{ type: 'js', module: 'redux-typed-reducer', modPath: '../dist', file: 'redux-typed-reducer.js' },
|
|
293
|
-
{ type: 'js', src: 'adapt.js' },
|
|
294
|
-
{ type: 'js', src: 'tipos.js' },
|
|
295
|
-
{ type: 'js', src: 'bypass-formulario.js' },
|
|
296
|
-
{ type: 'js', src: 'redux-formulario.js' },
|
|
297
|
-
{ type: 'js', src: 'render-general.js' },
|
|
298
|
-
{ type: 'js', src: 'render-formulario.js' },
|
|
299
|
-
{ type: 'js', src: 'abrir-formulario.js' },
|
|
300
|
-
{ type: 'css', file: 'menu.css' },
|
|
301
|
-
{ type: 'css', file: 'formulario-react.css' },
|
|
302
|
-
...menuedResources
|
|
303
|
-
];
|
|
304
|
-
return resources;
|
|
305
|
-
// .map(m=>({...m, file:m.fileDevelopment||m.file}));
|
|
306
|
-
}
|
|
307
|
-
async refreshCaches() {
|
|
308
|
-
this.caches.tableContent = this.caches.tableContent || {};
|
|
309
|
-
await this.inDbClient(null, async (client) => {
|
|
310
|
-
this.caches.tableContent.no_rea = (await client.query(`select * from no_rea order by no_rea`).fetchAll()).rows;
|
|
311
|
-
console.log('caches', this.caches.tableContent.no_rea);
|
|
312
|
-
this.caches.tableContent.no_rea_groups = (await client.query(`
|
|
313
|
-
select grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo order by 1
|
|
314
|
-
`).fetchAll()).rows;
|
|
315
|
-
this.caches.tableContent.no_rea_groups0 = (await client.query(`
|
|
316
|
-
select grupo0 as grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo0 order by 1
|
|
317
|
-
`).fetchAll()).rows;
|
|
318
|
-
});
|
|
319
|
-
console.log('caches ok');
|
|
320
|
-
}
|
|
321
|
-
sqlNoreaCase(campoNecesario) {
|
|
322
|
-
var be = this;
|
|
323
|
-
return `CASE ${be.caches.tableContent.no_rea.map(x => ` WHEN json_encuesta ->> ${be.db.quoteLiteral(x.variable)} = ${be.db.quoteLiteral(x.valor)} THEN ${be.db.quoteLiteral(x[campoNecesario])}`).join('')} WHEN TRUE THEN NULL END`;
|
|
324
|
-
}
|
|
325
|
-
getContext(req) {
|
|
326
|
-
var _a, _b;
|
|
327
|
-
var be = this;
|
|
328
|
-
var fatherContext = super.getContext(req);
|
|
329
|
-
if (fatherContext.user) {
|
|
330
|
-
if ((_a = be.permisosRol[req.user.rol]) === null || _a === void 0 ? void 0 : _a.superuser) {
|
|
331
|
-
return { superuser: true, puede: be.permisosSuperuser, ...fatherContext };
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
return { puede: (_b = be.permisosRol[req.user.rol]) === null || _b === void 0 ? void 0 : _b.puede, ...fatherContext };
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return { puede: be.permisosParaNadie, ...fatherContext };
|
|
338
|
-
}
|
|
339
|
-
getContextForDump() {
|
|
340
|
-
var fatherContext = super.getContextForDump();
|
|
341
|
-
return { superuser: true, puede: this.permisosSuperuser, ...fatherContext };
|
|
342
|
-
}
|
|
343
|
-
getClientSetupForSendToFrontEnd(req) {
|
|
344
|
-
var _a;
|
|
345
|
-
return {
|
|
346
|
-
...super.getClientSetupForSendToFrontEnd(req),
|
|
347
|
-
idper: (_a = req.user) === null || _a === void 0 ? void 0 : _a.idper
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
createResourcesForCacheJson(parameters) {
|
|
351
|
-
var be = this;
|
|
352
|
-
var jsonResult = {};
|
|
353
|
-
jsonResult.version = APP_DM_VERSION;
|
|
354
|
-
jsonResult.appName = 'dmencu';
|
|
355
|
-
jsonResult.cache = [
|
|
356
|
-
"campo",
|
|
357
|
-
"offline",
|
|
358
|
-
"lib/react.production.min.js",
|
|
359
|
-
"lib/react-dom.production.min.js",
|
|
360
|
-
"lib/material-ui.production.min.js",
|
|
361
|
-
"lib/clsx.min.js",
|
|
362
|
-
"lib/redux.min.js",
|
|
363
|
-
"lib/react-redux.min.js",
|
|
364
|
-
"lib/memoize-one.js",
|
|
365
|
-
"lib/qrcode.js",
|
|
366
|
-
"lib/require-bro.js",
|
|
367
|
-
"lib/cast-error.js",
|
|
368
|
-
"lib/like-ar.js",
|
|
369
|
-
"lib/best-globals.js",
|
|
370
|
-
"lib/json4all.js",
|
|
371
|
-
"lib/js-to-html.js",
|
|
372
|
-
"lib/redux-typed-reducer.js",
|
|
373
|
-
"adapt.js",
|
|
374
|
-
"unlogged.js",
|
|
375
|
-
"lib/js-yaml.js",
|
|
376
|
-
"lib/xlsx.core.min.js",
|
|
377
|
-
"lib/lazy-some.js",
|
|
378
|
-
"lib/sql-tools.js",
|
|
379
|
-
"dialog-promise/dialog-promise.js",
|
|
380
|
-
"moment/min/moment.js",
|
|
381
|
-
"pikaday/pikaday.js",
|
|
382
|
-
"lib/polyfills-bro.js",
|
|
383
|
-
"lib/big.js",
|
|
384
|
-
"lib/type-store.js",
|
|
385
|
-
"lib/typed-controls.js",
|
|
386
|
-
"lib/ajax-best-promise.js",
|
|
387
|
-
"my-ajax.js",
|
|
388
|
-
"my-start.js",
|
|
389
|
-
"lib/my-localdb.js",
|
|
390
|
-
"lib/my-websqldb.js",
|
|
391
|
-
"lib/my-localdb.js.map",
|
|
392
|
-
"lib/my-websqldb.js.map",
|
|
393
|
-
"lib/my-things.js",
|
|
394
|
-
"lib/my-tables.js",
|
|
395
|
-
"lib/my-inform-net-status.js",
|
|
396
|
-
"lib/my-menu.js",
|
|
397
|
-
"lib/my-skin.js",
|
|
398
|
-
"lib/cliente-en-castellano.js",
|
|
399
|
-
"lib/service-worker-admin.js",
|
|
400
|
-
"lib/redux-typed-reducer.js",
|
|
401
|
-
"client_modules/operativos.js",
|
|
402
|
-
"client_modules/varcal.js",
|
|
403
|
-
"client_modules/form-structure.js",
|
|
404
|
-
"client_modules/meta-enc.js",
|
|
405
|
-
"client_modules/datos-ext.js",
|
|
406
|
-
"client_modules/consistencias.js",
|
|
407
|
-
"client_modules/procesamiento.js",
|
|
408
|
-
"tipos.js",
|
|
409
|
-
"bypass-formulario.js",
|
|
410
|
-
"redux-formulario.js",
|
|
411
|
-
"render-general.js",
|
|
412
|
-
"render-formulario.js",
|
|
413
|
-
"abrir-formulario.js",
|
|
414
|
-
"client_modules/row-validator.js",
|
|
415
|
-
"client/menu.js",
|
|
416
|
-
"client/menu.js",
|
|
417
|
-
"img/logo.png",
|
|
418
|
-
//"img/logo-dm.png",
|
|
419
|
-
"img/logo-128.png",
|
|
420
|
-
"img/main-loading.gif",
|
|
421
|
-
"img/borrar-valor.png",
|
|
422
|
-
"img/fondo-salteado-error.png",
|
|
423
|
-
"img/fondo-salteado.png",
|
|
424
|
-
"img/fondo-salteado.png",
|
|
425
|
-
"img/background-test.png",
|
|
426
|
-
"client-setup",
|
|
427
|
-
"css/bootstrap.min.css",
|
|
428
|
-
"css/formulario-react.css",
|
|
429
|
-
"pikaday/pikaday.css",
|
|
430
|
-
"dialog-promise/dialog-promise.css",
|
|
431
|
-
"rel-enc/estados.css",
|
|
432
|
-
"css/my-tables.css",
|
|
433
|
-
"css/my-menu.css",
|
|
434
|
-
"css/my-things.css",
|
|
435
|
-
"css/menu.css",
|
|
436
|
-
"rel-enc/my-things2.css",
|
|
437
|
-
"css/formulario-react.css",
|
|
438
|
-
"css/Roboto-Regular.ttf"
|
|
439
|
-
];
|
|
440
|
-
jsonResult.fallback = [
|
|
441
|
-
{ "path": "login", "fallback": "offline" },
|
|
442
|
-
{ "path": "logout", "fallback": "offline" },
|
|
443
|
-
{ "path": "login#i=sincronizar", "fallback": "offline" },
|
|
444
|
-
{ "path": "menu#i=sincronizar", "fallback": "offline" }
|
|
445
|
-
];
|
|
446
|
-
return jsonResult;
|
|
447
|
-
}
|
|
448
|
-
getMenu(context) {
|
|
449
|
-
var _a, _b, _c;
|
|
450
|
-
let menu = [];
|
|
451
|
-
if (this.config.server.policy == 'web') {
|
|
452
|
-
if ((_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas.relevar) {
|
|
453
|
-
if (this.config['client-setup'].ambiente == 'demo' || this.config['client-setup'].ambiente == 'test' || this.config['client-setup'].ambiente == 'capa') {
|
|
454
|
-
menu.push({ menuType: 'demo', name: 'demo', selectedByDefault: true });
|
|
455
|
-
}
|
|
456
|
-
else {
|
|
457
|
-
menu.push({ menuType: 'path', name: 'relevamiento', path: '/campo' });
|
|
458
|
-
}
|
|
459
|
-
menu.push({ menuType: 'sincronizar_dm', name: 'sincronizar' });
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
if ((_c = (_b = context.puede) === null || _b === void 0 ? void 0 : _b.campo) === null || _c === void 0 ? void 0 : _c.editar) {
|
|
464
|
-
menu.push({ menuType: 'abrir_encuesta', name: 'abrir_encuesta' });
|
|
465
|
-
menu.push({ menuType: 'menu', name: 'recepcion', label: 'recepción', menuContent: [
|
|
466
|
-
{ menuType: 'table', name: 'mis_areas', table: 'areas', ff: { recepcionista: context.user.idper } },
|
|
467
|
-
{ menuType: 'table', name: 'mis_encuestadores' },
|
|
468
|
-
{ menuType: 'table', name: 'areas' },
|
|
469
|
-
{ menuType: 'table', name: 'tem_recepcion', label: 'TEM' },
|
|
470
|
-
] });
|
|
471
|
-
}
|
|
472
|
-
console.log("context user", context.user);
|
|
473
|
-
if (context.superuser) {
|
|
474
|
-
menu.push({ menuType: 'menu', name: 'control', menuContent: [
|
|
475
|
-
{ menuType: 'table', name: 'resumen', table: 'control_resumen', selectedByDefault: true },
|
|
476
|
-
{ menuType: 'table', name: 'dominio', table: 'control_campo' },
|
|
477
|
-
{ menuType: 'table', name: 'zona', table: 'control_campo_zona' },
|
|
478
|
-
{ menuType: 'table', name: 'comuna', table: 'control_campo_comuna' },
|
|
479
|
-
{ menuType: 'table', name: 'área', table: 'control_campo_area' },
|
|
480
|
-
{ menuType: 'table', name: 'participacion', table: 'control_campo_participacion' },
|
|
481
|
-
] });
|
|
482
|
-
}
|
|
483
|
-
if (context.superuser) {
|
|
484
|
-
menu = [...menu,
|
|
485
|
-
{ menuType: 'menu', name: 'configurar', menuContent: [
|
|
486
|
-
{ menuType: 'menu', name: 'muestra', label: 'muestra', menuContent: [
|
|
487
|
-
{ menuType: 'table', name: 'tem', label: 'TEM' },
|
|
488
|
-
{ menuType: 'table', name: 'tareas' },
|
|
489
|
-
{ menuType: 'table', name: 'resultados_tarea' },
|
|
490
|
-
// {menuType:'table', name:'personal_rol'},
|
|
491
|
-
] },
|
|
492
|
-
{ menuType: 'menu', name: 'metadatos', menuContent: [
|
|
493
|
-
{ menuType: 'table', name: 'operativos' },
|
|
494
|
-
{ menuType: 'table', name: 'formularios', table: 'casilleros_principales' },
|
|
495
|
-
{ menuType: 'table', name: 'plano', table: 'casilleros' },
|
|
496
|
-
{ menuType: 'table', name: 'tipoc', label: 'tipos de celdas' },
|
|
497
|
-
{ menuType: 'table', name: 'tipoc_tipoc', label: 'inclusiones de celdas' },
|
|
498
|
-
] },
|
|
499
|
-
{ menuType: 'table', name: 'parametros' },
|
|
500
|
-
] },
|
|
501
|
-
{ menuType: 'menu', name: 'usuarios', menuContent: [
|
|
502
|
-
{ menuType: 'table', name: 'usuarios', selectedByDefault: true },
|
|
503
|
-
{ menuType: 'table', name: 'roles' },
|
|
504
|
-
{ menuType: 'table', name: 'permisos' },
|
|
505
|
-
{ menuType: 'table', name: 'roles_permisos' },
|
|
506
|
-
] },
|
|
507
|
-
// {menuType:'proc', name:'generate_tabledef', proc:'tabledef_generate', label:'generar tablas' },
|
|
508
|
-
];
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
return { menu };
|
|
512
|
-
}
|
|
513
|
-
prepareGetTables() {
|
|
514
|
-
var be = this;
|
|
515
|
-
super.prepareGetTables();
|
|
516
|
-
this.getTableDefinition = {
|
|
517
|
-
...this.getTableDefinition,
|
|
518
|
-
roles: table_roles_1.roles,
|
|
519
|
-
usuarios: table_usuarios_1.usuarios,
|
|
520
|
-
personal: table_personal_1.personal,
|
|
521
|
-
recepcionistas: table_recepcionistas_1.recepcionistas,
|
|
522
|
-
encuestadores: table_encuestadores_1.encuestadores,
|
|
523
|
-
mis_encuestadores: table_mis_encuestadores_1.mis_encuestadores,
|
|
524
|
-
recuperadores: table_recuperadores_1.recuperadores,
|
|
525
|
-
supervisores: table_supervisores_1.supervisores,
|
|
526
|
-
personal_rol: table_personal_rol_1.personal_rol,
|
|
527
|
-
permisos: table_permisos_1.permisos,
|
|
528
|
-
roles_permisos: table_roles_permisos_1.roles_permisos,
|
|
529
|
-
roles_subordinados: table_roles_subordinados_1.roles_subordinados,
|
|
530
|
-
no_rea: table_no_rea_1.no_rea,
|
|
531
|
-
semanas: table_semanas_1.semanas,
|
|
532
|
-
tem: table_tem_1.tem,
|
|
533
|
-
tem_recepcion: table_tem_recepcion_1.tem_recepcion,
|
|
534
|
-
parametros: table_parametros_1.parametros,
|
|
535
|
-
operaciones: table_operaciones_1.operaciones,
|
|
536
|
-
comunas: table_comunas_1.comunas,
|
|
537
|
-
areas: table_areas_1.areas,
|
|
538
|
-
sincronizaciones: table_sincronizaciones_1.sincronizaciones,
|
|
539
|
-
tareas: table_tareas_1.tareas,
|
|
540
|
-
resultados_tarea: table_resultados_tarea_1.resultados_tarea,
|
|
541
|
-
tareas_tem: table_tareas_tem_1.tareas_tem,
|
|
542
|
-
tareas_areas: table_tareas_areas_1.tareas_areas,
|
|
543
|
-
mis_tareas: table_mis_tareas_1.mis_tareas,
|
|
544
|
-
mis_tareas_tem: table_mis_tareas_tem_1.mis_tareas_tem,
|
|
545
|
-
mis_tareas_areas: table_mis_tareas_areas_1.mis_tareas_areas,
|
|
546
|
-
control_campo: table_control_campo_1.control_campo,
|
|
547
|
-
control_resumen: table_control_resumen_1.control_resumen,
|
|
548
|
-
control_campo_zona: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x zona solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }], filtroWhere: 'true' }),
|
|
549
|
-
control_campo_comuna: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x comuna solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'integer' }], filtroWhere: 'true' }),
|
|
550
|
-
control_campo_area: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x area', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'integer' }, { name: 'area', typeName: 'integer' }, { name: 'participacion_a', typeName: 'text' }, { name: 'clase_a', typeName: 'text' }] }),
|
|
551
|
-
control_campo_participacion: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x participacion', camposCorte: [{ name: 'participacion', typeName: 'bigint' }] }),
|
|
552
|
-
};
|
|
553
|
-
be.appendToTableDefinition('consistencias', function (tableDef, context) {
|
|
554
|
-
tableDef.fields.forEach(function (field) {
|
|
555
|
-
if (field.name == 'error_compilacion') {
|
|
556
|
-
if (field.visible) {
|
|
557
|
-
console.error('************ QUITAR ESTO error_compilacion ya es visible');
|
|
558
|
-
}
|
|
559
|
-
field.visible = true;
|
|
560
|
-
}
|
|
561
|
-
});
|
|
562
|
-
});
|
|
563
|
-
be.appendToTableDefinition('inconsistencias', function (tableDef, context) {
|
|
564
|
-
var _a;
|
|
565
|
-
tableDef.fields.splice(2, 0, { name: 'id_caso', typeName: 'text', label: 'caso', editable: false });
|
|
566
|
-
tableDef.editable = tableDef.editable || ((_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas.justificar);
|
|
567
|
-
tableDef.fields.forEach(function (field) {
|
|
568
|
-
var _a;
|
|
569
|
-
if (field.name == 'pk_integrada') {
|
|
570
|
-
field.visible = false;
|
|
571
|
-
}
|
|
572
|
-
if (field.name == 'justificacion') {
|
|
573
|
-
field.editable = context.forDump || ((_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas.justificar);
|
|
574
|
-
}
|
|
575
|
-
});
|
|
576
|
-
});
|
|
577
|
-
be.appendToTableDefinition('operativos', function (tableDef, context) {
|
|
578
|
-
tableDef.fields.splice(2, 0, {
|
|
579
|
-
name: 'config_sorteo',
|
|
580
|
-
typeName: 'jsonb',
|
|
581
|
-
editable: false
|
|
582
|
-
});
|
|
583
|
-
tableDef.fields.splice(3, 0, {
|
|
584
|
-
name: 'disform_cerrado',
|
|
585
|
-
typeName: 'boolean',
|
|
586
|
-
defaultValue: false,
|
|
587
|
-
editable: context.forDump || ['admin', 'dis_conceptual'].includes(context.user.rol)
|
|
588
|
-
});
|
|
589
|
-
});
|
|
590
|
-
// be.appendToTableDefinition('casilleros',function(tableDef, context){
|
|
591
|
-
// tableDef.constraints = tableDef.constraints.filter(c=>c.consName!='casilleros salto REL')
|
|
592
|
-
// })
|
|
593
|
-
}
|
|
594
|
-
};
|
|
595
|
-
}
|
|
596
|
-
exports.emergeAppDmEncu = emergeAppDmEncu;
|
|
597
|
-
});
|
|
598
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWRtZW5jdS50cy5MT0NBTC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvYXBwLWRtZW5jdS50cy5MT0NBTC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7SUFBQSxZQUFZLENBQUM7OztJQUdiLDJEQUF5RTtJQUV6RSx3Q0FBd0M7SUFFeEMsd0NBQXdDO0lBSXhDLDZCQUE2QjtJQUU3QixrQ0FBa0M7SUFFbEMsMkJBQW1DO0lBRW5DLCtDQUFvRDtJQUNwRCxxREFBdUQ7SUFDdkQsaUVBQTZEO0lBQzdELCtEQUE4RDtJQUM5RCx1RUFBa0U7SUFDbEUsK0RBQTREO0lBQzVELDZEQUEyRDtJQUMzRCw2REFBMkQ7SUFDM0QscURBQXVEO0lBQ3ZELGlFQUE2RDtJQUM3RCx5REFBeUQ7SUFDekQseUVBQWlFO0lBRWpFLGlEQUFxRDtJQUNyRCwyQ0FBa0Q7SUFDbEQsK0RBQTREO0lBQzVELG1EQUFzRDtJQUN0RCxxREFBdUQ7SUFDdkQsMkRBQTBEO0lBQzFELG1EQUFzRDtJQUN0RCwrQ0FBb0Q7SUFDcEQscUVBQStEO0lBQy9ELGlEQUFxRDtJQUNyRCx5REFBeUQ7SUFDekQsNkRBQTJEO0lBQzNELHlEQUF5RDtJQUN6RCxpRUFBNkQ7SUFDN0QscUVBQStEO0lBQy9ELHFFQUErRDtJQUMvRCwrREFBNEQ7SUFDNUQsbUVBQThEO0lBRTlELDZDQUFzQztJQUV0QyxNQUFNLGNBQWMsR0FBQyxZQUFZLENBQUM7SUFHbEMsU0FBZ0IsZUFBZSxDQUE0RCxJQUFNO1FBQy9GLE9BQU8sTUFBTSxTQUFVLFNBQVEsSUFBSTtZQUNqQyxZQUFZLEdBQUcsSUFBVTtnQkFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENB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QyxPQUFPLENBQUMsT0FBTyxLQUFJLE1BQUEsT0FBTyxDQUFDLEtBQUssMENBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQSxDQUFDO3lCQUN6RTtvQkFDTCxDQUFDLENBQUMsQ0FBQTtnQkFDTixDQUFDLENBQUMsQ0FBQTtnQkFDRixFQUFFLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFDLFVBQVMsUUFBUSxFQUFFLE9BQU87b0JBQzlELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUM7d0JBQ3ZCLElBQUksRUFBQyxlQUFlO3dCQUNwQixRQUFRLEVBQUMsT0FBTzt3QkFDaEIsUUFBUSxFQUFFLEtBQUs7cUJBQ2xCLENBQUMsQ0FBQztvQkFDSCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDO3dCQUN2QixJQUFJLEVBQUMsaUJBQWlCO3dCQUN0QixRQUFRLEVBQUMsU0FBUzt3QkFDbEIsWUFBWSxFQUFFLEtBQUs7d0JBQ25CLFFBQVEsRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFFLENBQUMsT0FBTyxFQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO3FCQUFDLENBQ3BGLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUE7Z0JBRUYsdUVBQXVFO2dCQUN2RSxnR0FBZ0c7Z0JBQ2hHLEtBQUs7WUFDVCxDQUFDO1NBQ0YsQ0FBQTtJQUNILENBQUM7SUFwakJELDBDQW9qQkMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCAqIGFzIHByb2Nlc2FtaWVudG8gZnJvbSBcInByb2Nlc2FtaWVudG9cIjtcclxuaW1wb3J0IHtnZXRPcGVyYXRpdm9BY3R1YWwsIFByb2NlZHVyZXNEbUVuY3V9IGZyb20gXCIuL3Byb2NlZHVyZXMtZG1lbmN1XCI7XHJcblxyXG5pbXBvcnQgKiBhcyBwZyBmcm9tIFwicGctcHJvbWlzZS1zdHJpY3RcIjtcclxuaW1wb3J0IHtqc29ufSBmcm9tIFwicGctcHJvbWlzZS1zdHJpY3RcIjtcclxuaW1wb3J0ICogYXMgbWluaVRvb2xzIGZyb20gXCJtaW5pLXRvb2xzXCI7XHJcbmltcG9ydCB7Q29udGV4dCwgTWVudUluZm9CYXNlLCBSZXF1ZXN0LCBSZXNwb25zZX0gZnJvbSBcIi4vdHlwZXMtZG1lbmN1XCI7XHJcbmltcG9ydCB7IGNoYW5naW5nIH0gZnJvbSBcImJlc3QtZ2xvYmFsc1wiO1xyXG5cclxuaW1wb3J0ICogYXMgeWF6bCBmcm9tIFwieWF6bFwiO1xyXG5pbXBvcnQgeyBOZXh0RnVuY3Rpb24gfSBmcm9tIFwiZXhwcmVzcy1zZXJ2ZS1zdGF0aWMtY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBsaWtlQXIgZnJvbSBcImxpa2UtYXJcIjtcclxuXHJcbmltcG9ydCB7cHJvbWlzZXMgYXMgZnMgfSBmcm9tIFwiZnNcIjtcclxuXHJcbmltcG9ydCB7IHJvbGVzICAgICAgICAgICAgICAgfSBmcm9tIFwiLi90YWJsZS1yb2xlc1wiO1xyXG5pbXBvcnQgeyBwZXJzb25hbCAgICAgICAgICAgIH0gZnJvbSBcIi4vdGFibGUtcGVyc29uYWxcIjtcclxuaW1wb3J0IHsgcmVjZXBjaW9uaXN0YXMgICAgICB9IGZyb20gXCIuL3RhYmxlLXJlY2VwY2lvbmlzdGFzXCI7XHJcbmltcG9ydCB7IGVuY3Vlc3RhZG9yZXMgICAgICAgICB9IGZyb20gXCIuL3RhYmxlLWVuY3Vlc3RhZG9yZXNcIjtcclxuaW1wb3J0IHsgbWlzX2VuY3Vlc3RhZG9yZXMgICAgIH0gZnJvbSBcIi4vdGFibGUtbWlzX2VuY3Vlc3RhZG9yZXNcIjtcclxuaW1wb3J0IHsgcmVjdXBlcmFkb3JlcyAgICAgICB9IGZyb20gXCIuL3RhYmxlLXJlY3VwZXJhZG9yZXNcIjtcclxuaW1wb3J0IHsgc3VwZXJ2aXNvcmVzICAgICAgICB9IGZyb20gXCIuL3RhYmxlLXN1cGVydmlzb3Jlc1wiO1xyXG5pbXBvcnQgeyBwZXJzb25hbF9yb2wgICAgICAgIH0gZnJvbSBcIi4vdGFibGUtcGVyc29uYWxfcm9sXCI7XHJcbmltcG9ydCB7IHBlcm1pc29zICAgICAgICAgICAgfSBmcm9tIFwiLi90YWJsZS1wZXJtaXNvc1wiO1xyXG5pbXBvcnQgeyByb2xlc19wZXJtaXNvcyAgICAgIH0gZnJvbSBcIi4vdGFibGUtcm9sZXNfcGVybWlzb3NcIjtcclxuaW1wb3J0IHsgcGFyYW1ldHJvcyAgICAgICAgICB9IGZyb20gXCIuL3RhYmxlLXBhcmFtZXRyb3NcIjtcclxuaW1wb3J0IHsgcm9sZXNfc3Vib3JkaW5hZG9zICB9IGZyb20gXCIuL3RhYmxlLXJvbGVzX3N1Ym9yZGluYWRvc1wiO1xyXG5cclxuaW1wb3J0IHtub19yZWEgICAgICAgICAgICAgICB9IGZyb20gXCIuL3RhYmxlLW5vX3JlYVwiO1xyXG5pbXBvcnQge3RlbSAgICAgICAgICAgICAgICAgIH0gZnJvbSBcIi4vdGFibGUtdGVtXCI7XHJcbmltcG9ydCB7dGVtX3JlY2VwY2lvbiAgICAgICAgfSBmcm9tIFwiLi90YWJsZS10ZW1fcmVjZXBjaW9uXCI7XHJcbmltcG9ydCB7c2VtYW5hcyAgICAgICAgICAgICAgfSBmcm9tIFwiLi90YWJsZS1zZW1hbmFzXCI7XHJcbmltcG9ydCB7IHVzdWFyaW9zICAgICAgICAgICAgfSBmcm9tICcuL3RhYmxlLXVzdWFyaW9zJztcclxuaW1wb3J0IHsgb3BlcmFjaW9uZXMgICAgICAgICB9IGZyb20gJy4vdGFibGUtb3BlcmFjaW9uZXMnO1xyXG5pbXBvcnQgeyBjb211bmFzICAgICAgICAgICAgIH0gZnJvbSAnLi90YWJsZS1jb211bmFzJztcclxuaW1wb3J0IHsgYXJlYXMgICAgICAgICAgICAgICB9IGZyb20gJy4vdGFibGUtYXJlYXMnO1xyXG5pbXBvcnQgeyBzaW5jcm9uaXphY2lvbmVzICAgIH0gZnJvbSAnLi90YWJsZS1zaW5jcm9uaXphY2lvbmVzJztcclxuaW1wb3J0IHsgdGFyZWFzICAgICAgICAgICAgICB9IGZyb20gJy4vdGFibGUtdGFyZWFzJztcclxuaW1wb3J0IHsgdGFyZWFzX3RlbSAgICAgICAgICB9IGZyb20gJy4vdGFibGUtdGFyZWFzX3RlbSc7XHJcbmltcG9ydCB7IHRhcmVhc19hcmVhcyAgICAgICAgfSBmcm9tICcuL3RhYmxlLXRhcmVhc19hcmVhcyc7XHJcbmltcG9ydCB7IG1pc190YXJlYXMgICAgICAgICAgfSBmcm9tICcuL3RhYmxlLW1pc190YXJlYXMnO1xyXG5pbXBvcnQgeyBtaXNfdGFyZWFzX3RlbSAgICAgIH0gZnJvbSAnLi90YWJsZS1taXNfdGFyZWFzX3RlbSc7XHJcbmltcG9ydCB7IG1pc190YXJlYXNfYXJlYXMgICAgfSBmcm9tICcuL3RhYmxlLW1pc190YXJlYXNfYXJlYXMnO1xyXG5pbXBvcnQgeyByZXN1bHRhZG9zX3RhcmVhICAgIH0gZnJvbSAnLi90YWJsZS1yZXN1bHRhZG9zX3RhcmVhJztcclxuaW1wb3J0IHsgY29udHJvbF9jYW1wbyAgICAgICB9IGZyb20gJy4vdGFibGUtY29udHJvbF9jYW1wbyc7XHJcbmltcG9ydCB7IGNvbnRyb2xfcmVzdW1lbiAgICAgfSBmcm9tICcuL3RhYmxlLWNvbnRyb2xfcmVzdW1lbic7XHJcblxyXG5pbXBvcnQge2RlZkNvbmZpZ30gZnJvbSBcIi4vZGVmLWNvbmZpZ1wiXHJcblxyXG5jb25zdCBBUFBfRE1fVkVSU0lPTj1cIiMyMi0wNC0wNGJcIjtcclxuXHJcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3KC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xyXG5leHBvcnQgZnVuY3Rpb24gZW1lcmdlQXBwRG1FbmN1PFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcjxwcm9jZXNhbWllbnRvLkFwcFByb2Nlc2FtaWVudG9UeXBlPj4oQmFzZTpUKXtcclxuICByZXR1cm4gY2xhc3MgQXBwRG1FbmN1IGV4dGVuZHMgQmFzZXtcclxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6YW55W10peyBcclxuICAgICAgICBzdXBlcihhcmdzKTsgXHJcbiAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50ID0gdGhpcy5jYWNoZXMudGFibGVDb250ZW50IHx8IHt9O1xyXG4gICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWE9W11cclxuICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3Vwcz1bXVxyXG4gICAgICAgIHRoaXMubWV0YUVuY0luY2x1aXJDYXNpbGxlcm9zU2FsdG9SRUwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldFByb2NlZHVyZXMoKXtcclxuICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgIHZhciBwcm9jZWRpbWllbnRvQVJlZW1wbGF6YXI9W1wiY2Fzb19ndWFyZGFyXCIsXCJjYXNvX3RyYWVyXCJdO1xyXG4gICAgICAgIHZhciBwYXJlbnRQcm9jID0gYXdhaXQgc3VwZXIuZ2V0UHJvY2VkdXJlcygpO1xyXG4gICAgICAgIHBhcmVudFByb2MgPSBwYXJlbnRQcm9jLmZpbHRlcigocHJvY2VkdXJlOmFueSkgPT4gIXByb2NlZGltaWVudG9BUmVlbXBsYXphci5pbmNsdWRlcyhwcm9jZWR1cmUuYWN0aW9uKSk7XHJcbiAgICAgICAgcGFyZW50UHJvYyA9IHBhcmVudFByb2MubWFwKHByb2NEZWY9PntcclxuICAgICAgICAgICAgaWYocHJvY0RlZi5hY3Rpb24gPT0gJ3RhYmxlX3JlY29yZF9zYXZlJyB8fCBwcm9jRGVmLmFjdGlvbiA9PSAndGFibGVfcmVjb3JkX2RlbGV0ZScpe1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvcmVGdW5jdGlvbkludGVybm8gPSBwcm9jRGVmLmNvcmVGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgIHByb2NEZWYuY29yZUZ1bmN0aW9uID0gYXN5bmMgZnVuY3Rpb24oY29udGV4dCwgcGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvcmVGdW5jdGlvbkludGVybm8oY29udGV4dCwgcGFyYW1ldGVycylcclxuICAgICAgICAgICAgICAgICAgICBpZihwYXJhbWV0ZXJzLnRhYmxlID09ICdjYXNpbGxlcm9zJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlIHRvY8OzIGxhIGVzdHJ1Y3R1cmEnLCBiZS50aW1lc3RhbXBFc3RydWN0dXJhKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9jRGVmO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHBhcmVudFByb2MuY29uY2F0KFByb2NlZHVyZXNEbUVuY3UpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgY2hlY2tEYXRhYmFzZVN0cnVjdHVyZShfY2xpZW50OkNsaWVudCl7XHJcbiAgICB9XHJcbiAgICBhZGRTY2hyw7ZkaW5nZXJTZXJ2aWNlcyhtYWluQXBwOnByb2Nlc2FtaWVudG8uRXhwcmVzcywgYmFzZVVybDpzdHJpbmcpe1xyXG4gICAgICAgIGxldCBiZT10aGlzO1xyXG4gICAgICAgIHN1cGVyLmFkZFNjaHLDtmRpbmdlclNlcnZpY2VzKG1haW5BcHAsIGJhc2VVcmwpO1xyXG4gICAgICAgIG1haW5BcHAudXNlKGZ1bmN0aW9uKHJlcTpSZXF1ZXN0LHJlczpSZXNwb25zZSwgbmV4dDpOZXh0RnVuY3Rpb24pe1xyXG4gICAgICAgICAgICBpZihyZXEuc2Vzc2lvbiAmJiAhcmVxLnNlc3Npb24uaW5zdGFsbCl7XHJcbiAgICAgICAgICAgICAgICByZXEuc2Vzc2lvbi5pbnN0YWxsPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV4dCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbWFpbkFwcC5nZXQoYmFzZVVybCsnL2NhbXBvJyxhc3luYyBmdW5jdGlvbihyZXEscmVzLF9uZXh0KXtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBzw6kgcXVlIHZveSBhIHJlY2liaXIgdXNlcmFnZW50IHBvciBsb3MgbWlkZGxld2FyZXMgZGUgQmFja2VuZC1wbHVzXHJcbiAgICAgICAgICAgIHZhciB7dXNlcmFnZW50LCB1c2VyfSA9IHJlcTtcclxuICAgICAgICAgICAgaWYodXNlcil7XHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge3t0eXBlOidqcycsIHNyYzpzdHJpbmd9W119ICovXHJcbiAgICAgICAgICAgICAgICB2YXIgd2ViTWFuaWZlc3RQYXRoID0gJ2NhcmdhLWRtL3dlYi1tYW5pZmVzdC53ZWJtYW5pZmVzdCc7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbE1haW49YmUubWFpblBhZ2Uoe3VzZXJhZ2VudCwgdXNlcn0sIGZhbHNlLCB7c2tpcE1lbnU6dHJ1ZSwgd2ViTWFuaWZlc3RQYXRofSkudG9IdG1sRG9jKCk7XHJcbiAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZVRleHQoaHRtbE1haW4sJ2h0bWwnKShyZXEscmVzKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXMucmVkaXJlY3QoYmFzZVVybCsnL2xvZ2luI3c9cGF0aCZwYXRoPS9jYW1wbycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgY3JlYXRlU2VydmljZVdvcmtlciA9IGFzeW5jIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHZhciBzdyA9IGF3YWl0IGZzLnJlYWRGaWxlKCdub2RlX21vZHVsZXMvc2VydmljZS13b3JrZXItYWRtaW4vZGlzdC9zZXJ2aWNlLXdvcmtlci13by1tYW5pZmVzdC5qcycsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgIHZhciBtYW5pZmVzdCA9IGJlLmNyZWF0ZVJlc291cmNlc0ZvckNhY2hlSnNvbih7fSk7XHJcbiAgICAgICAgICAgIHZhciBzd01hbmlmZXN0ID0gc3dcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qdmVyc2lvbiovJ1wiLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC52ZXJzaW9uKSlcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qYXBwTmFtZSovJ1wiLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5hcHBOYW1lKSlcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFtcXHMqXFwvXFwqdXJsc1RvQ2FjaGVcXCpcXC9cXHMqXFxdLywgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QuY2FjaGUpKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcW1xccypcXC9cXCpmYWxsYmFja3NcXCpcXC9cXHMqXFxdLywgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QuZmFsbGJhY2sgfHwgW10pKTtcclxuICAgICAgICAgICAgICAgIC8vLnJlcGxhY2UoXCIvI0NBQ0hFJC9cIiwgXCIvKGFcXFxcZCttXFxcXGQrcFxcXFxkK3RcXFxcZCtfZXN0cnVjdHVyYS5qcyl8KGFcXFxcZCttXFxcXGQrcFxcXFxkK3RcXFxcZCtfaGRyLmpzb24pL1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN3TWFuaWZlc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFpbkFwcC5nZXQoYmFzZVVybCtgL3N3LW1hbmlmZXN0LmpzYCwgYXN5bmMgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpe1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVUZXh0KGF3YWl0IGNyZWF0ZVNlcnZpY2VXb3JrZXIoKSwnYXBwbGljYXRpb24vamF2YXNjcmlwdCcpKHJlcSxyZXMpO1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUVycihyZXEscmVzLG5leHQpKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsK2AvY2FyZ2EtZG0vd2ViLW1hbmlmZXN0LndlYm1hbmlmZXN0YCwgYXN5bmMgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpe1xyXG4gICAgICAgICAgICBjb25zdCBBUFBfTkFNRSA9IChhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIChjbGllbnQ6cGcuQ2xpZW50KT0+XHJcbiAgICAgICAgICAgICAgICBjbGllbnQucXVlcnkoXCJzZWxlY3Qgb3BlcmF0aXZvIGZyb20gcGFyYW1ldHJvcyB3aGVyZSB1bmljb19yZWdpc3Ryb1wiKS5mZXRjaFVuaXF1ZVZhbHVlKClcclxuICAgICAgICAgICAgKSkudmFsdWU7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBgJHtBUFBfTkFNRX0gUHJvZ3Jlc3NpdmUgV2ViIEFwcGAsXHJcbiAgICAgICAgICAgICAgICAgIFwic2hvcnRfbmFtZVwiOiBgJHtBUFBfTkFNRX0gUFdBYCxcclxuICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBgUHJvZ3Jlc3NpdmUgV2ViIEFwcCBmb3IgJHtBUFBfTkFNRX0uYCxcclxuICAgICAgICAgICAgICAgICAgXCJpY29uc1wiOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTMyLnBuZ2AsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNpemVzXCI6IFwiMzJ4MzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImltYWdlL3BuZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNyY1wiOiBgLi4vaW1nLyR7QVBQX05BTUV9LWxvZ28tZG0tNDgucG5nYCxcclxuICAgICAgICAgICAgICAgICAgICAgIFwic2l6ZXNcIjogXCI0OHg0OFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIFwic3JjXCI6IGAuLi9pbWcvJHtBUFBfTkFNRX0tbG9nby1kbS02NC5wbmdgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzaXplc1wiOiBcIjY0eDY0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbWFnZS9wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTcyLnBuZ2AsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNpemVzXCI6IFwiNzJ4NzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImltYWdlL3BuZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNyY1wiOiBgLi4vaW1nLyR7QVBQX05BTUV9LWxvZ28tZG0tMTkyLnBuZ2AsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInNpemVzXCI6IFwiMTkyeDE5MlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIFwic3JjXCI6IGAuLi9pbWcvJHtBUFBfTkFNRX0tbG9nby1kbS01MTIucG5nYCxcclxuICAgICAgICAgICAgICAgICAgICAgIFwic2l6ZXNcIjogXCI1MTJ4NTEyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbWFnZS9wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgXCJzdGFydF91cmxcIjogXCIuLi9jYW1wb1wiLFxyXG4gICAgICAgICAgICAgICAgICBcImRpc3BsYXlcIjogXCJzdGFuZGFsb25lXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwidGhlbWVfY29sb3JcIjogXCIjM0Y1MUI1XCIsXHJcbiAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZF9jb2xvclwiOiBcIiM2ZDYwZWRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlVGV4dChKU09OLnN0cmluZ2lmeShjb250ZW50KSwgJ2FwcGxpY2F0aW9uL2pzb24nKShyZXEscmVzKTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlRXJyKHJlcSwgcmVzLCBuZXh0KShlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhZGRMb2dnZWRTZXJ2aWNlcygpe1xyXG4gICAgICAgIHZhciBiZSA9IHRoaXM7XHJcbiAgICAgICAgc3VwZXIuYWRkTG9nZ2VkU2VydmljZXMoKTtcclxuICAgICAgICBiZS5hcHAuZ2V0KCcvbWFuaWZlc3QubWFuaWZlc3QnLCBhc3luYyBmdW5jdGlvbihyZXE6UmVxdWVzdCwgcmVzOlJlc3BvbnNlLCBuZXh0Ok5leHRGdW5jdGlvbil7XHJcbiAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUZpbGUoJ3NyYy9jbGllbnQvbWFuaWZlc3QubWFuaWZlc3QnLHt9KShyZXEscmVzKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFwcC5nZXQoJy9maWxlJywgYXN5bmMgZnVuY3Rpb24ocmVxOlJlcXVlc3QscmVzOlJlc3BvbnNlKXtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGJlLmluVHJhbnNhY3Rpb24ocmVxLCBcclxuICAgICAgICAgICAgICAgIChjbGllbnQ6cGcuQ2xpZW50KT0+XHJcbiAgICAgICAgICAgICAgICBjbGllbnQucXVlcnkoXCJzZWxlY3QgcnV0YSBmcm9tIGFkanVudG9zIHdoZXJlIGlkX2FkanVudG8gPSAkMVwiLFtyZXEucXVlcnkuaWRfYWRqdW50b10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVWYWx1ZSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHZhciBwYXRoID0gcmVzdWx0LnZhbHVlO1xyXG4gICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVGaWxlKHBhdGgse30pKHJlcSxyZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYXBwLmdldCgnL2ltYWdlbmVzJywgYXN5bmMgZnVuY3Rpb24ocmVxOlJlcXVlc3QscmVzOlJlc3BvbnNlKXtcclxuICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlRmlsZSgnbG9jYWwtaW1hZ2VzLycrcmVxLnF1ZXJ5LnBkZix7fSkocmVxLHJlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hcHAuZ2V0KCcvZG93bmxvYWQvYWxsJyxhc3luYyBmdW5jdGlvbihyZXE6UmVxdWVzdCwgcmVzOlJlc3BvbnNlLCBuZXh0OigpPT52b2lkKXtcclxuICAgICAgICAgICAgaWYocmVxLnVzZXI9PW51bGwgfHwgcmVxLnVzZXIucm9sIT0nYWRtaW4nKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBlc3TDoSBhdXRvcml6YWRvIGEgYmFqYXJzZSB0b2RvJyxyZXEudXNlcilcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHppcCA9IG5ldyB5YXpsLlppcEZpbGUoKTtcclxuICAgICAgICAgICAgemlwLm91dHB1dFN0cmVhbS5waXBlKHJlcyk7XHJcbiAgICAgICAgICAgIGxldCBiYXNlID0gJ2xvY2FsLWF0dGFjaG1lbnRzJ1xyXG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGJhc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoYXN5bmMgZnVuY3Rpb24oZmlsZU5hbWU6c3RyaW5nKXtcclxuICAgICAgICAgICAgICAgIHZhciBwYXRoID0gYmFzZSsnLycrZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3RhdCA9IGF3YWl0IGZzLnN0YXQocGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZihzdGF0LmlzRmlsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgemlwLmFkZEZpbGUocGF0aCxmaWxlTmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgemlwLmVuZCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBhc3luYyBwb3N0Q29uZmlnKCl7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIucG9zdENvbmZpZygpO1xyXG4gICAgICAgIHZhciBiZT10aGlzO1xyXG4gICAgICAgIGJlLm1ldGFFbmNJbmNsdWlyQ2FzaWxsZXJvc1NhbHRvUkVMID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihudWxsLCBhc3luYyBmdW5jdGlvbihjbGllbnQ6cGcuQ2xpZW50KXtcclxuICAgICAgICAgICAgdmFyIHFQZXJtaXNvcz1gXHJcbiAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHIucm9sLGpzb25iX2J1aWxkX29iamVjdCgnc3VwZXJ1c2VyJyxyLnN1cGVydXNlciwncHVlZGUnLChcclxuICAgICAgICAgICAgICAgICAgU0VMRUNUIGpzb25iX29iamVjdF9hZ2cocnAucGVybWlzbywoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHJwYS5hY2Npb24scnBhLmhhYmlsaXRhZG8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSByb2xlc19wZXJtaXNvcyBycGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBycGEucm9sPXJwLnJvbCBBTkQgcnBhLnBlcm1pc289cnAucGVybWlzb1xyXG4gICAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICAgICAgRlJPTSByb2xlc19wZXJtaXNvcyBycFxyXG4gICAgICAgICAgICAgICAgICAgIFdIRVJFIHJwLnJvbD1yLnJvbCAjY29uZEhhYmlsaXRhZG8jXHJcbiAgICAgICAgICAgICAgKSkpXHJcbiAgICAgICAgICAgICAgRlJPTSByb2xlcyByXHJcbiAgICAgICAgICAgIGA7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHFQZXJtaXNvcy5yZXBsYWNlKCcjY29uZEhhYmlsaXRhZG8jJywnJykpLmZldGNoVW5pcXVlVmFsdWUoKSxcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShxUGVybWlzb3MucmVwbGFjZSgnI2NvbmRIYWJpbGl0YWRvIycsYCBhbmQgcnAuJHtwZy5xdW90ZUlkZW50KCdoYWJpbGl0YWRvJyl9YCkpLmZldGNoVW5pcXVlVmFsdWUoKSxcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgU0VMRUNUIGpzb25iX29iamVjdF9hZ2cocGVybWlzbywoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKGFjY2lvbix0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gcGVybWlzb3MgcGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBwYS5wZXJtaXNvPXAucGVybWlzb1xyXG4gICAgICAgICAgICAgICAgICAgICAgKSlcclxuICAgICAgICAgICAgICAgICAgICAgIEZST00gcGVybWlzb3MgcFxyXG4gICAgICAgICAgICAgICAgYCkuZmV0Y2hVbmlxdWVWYWx1ZSgpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIGJlLnBlcm1pc29zUm9sPXJlc3VsdHNbMF0udmFsdWU7XHJcbiAgICAgICAgICAgIGJlLnBlcm1pc29zUm9sU29sb1RydWU9cmVzdWx0c1sxXS52YWx1ZTtcclxuICAgICAgICAgICAgYmUucGVybWlzb3NTdXBlcnVzZXI9cmVzdWx0c1syXS52YWx1ZTtcclxuICAgICAgICAgICAgYmUucGVybWlzb3NQYXJhTmFkaWU9bGlrZUFyKGJlLnBlcm1pc29zU3VwZXJ1c2VyKS5tYXAocD0+bGlrZUFyKHApLm1hcCh2YT0+ZmFsc2UpLnBsYWluKCkpLnBsYWluKClcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRpcihiZS5wZXJtaXNvc1JvbFNvbG9UcnVlLHtkZXB0aDo5fSk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kaXIoYmUucGVybWlzb3NTdXBlcnVzZXIse2RlcHRoOjl9KTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRpcihiZS5wZXJtaXNvc1BhcmFOYWRpZSx7ZGVwdGg6OX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaENhY2hlcygpO1xyXG4gICAgfVxyXG4gICAgY29uZmlnU3RhdGljQ29uZmlnKCl7XHJcbiAgICAgICAgc3VwZXIuY29uZmlnU3RhdGljQ29uZmlnKCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0aWNDb25maWcoZGVmQ29uZmlnKTtcclxuICAgIH1cclxuICAgIGNsaWVudEluY2x1ZGVzKHJlcSwgb3B0cykge1xyXG4gICAgICAgIHZhciBiZSA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGxvZ2dlZCA9IHJlcSAmJiBvcHRzICYmICFvcHRzLnNraXBNZW51IDtcclxuICAgICAgICB2YXIgbWVudWVkUmVzb3VyY2VzPWxvZ2dlZCA/IFtcclxuICAgICAgICAgICAgeyB0eXBlOidqcycgLCBzcmM6ICdjbGllbnQvY2xpZW50LmpzJyB9LFxyXG4gICAgICAgIF06W1xyXG4gICAgICAgICAgICB7dHlwZTonanMnICwgc3JjOid1bmxvZ2dlZC5qcycgfSxcclxuICAgICAgICBdO1xyXG4gICAgICAgIGlmKG9wdHMgJiYgb3B0cy5leHRyYUZpbGVzKXtcclxuICAgICAgICAgICAgbWVudWVkUmVzb3VyY2VzID0gbWVudWVkUmVzb3VyY2VzLmNvbmNhdChvcHRzLmV4dHJhRmlsZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzb3VyY2VzID0gW1xyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ3JlYWN0JywgbW9kUGF0aDogJ3VtZCcsIGZpbGVEZXZlbG9wbWVudDoncmVhY3QuZGV2ZWxvcG1lbnQuanMnLCBmaWxlOidyZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdyZWFjdC1kb20nLCBtb2RQYXRoOiAndW1kJywgZmlsZURldmVsb3BtZW50OidyZWFjdC1kb20uZGV2ZWxvcG1lbnQuanMnLCBmaWxlOidyZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnQG1hdGVyaWFsLXVpL2NvcmUnLCBtb2RQYXRoOiAndW1kJywgZmlsZURldmVsb3BtZW50OidtYXRlcmlhbC11aS5kZXZlbG9wbWVudC5qcycsIGZpbGU6J21hdGVyaWFsLXVpLnByb2R1Y3Rpb24ubWluLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2Nsc3gnLCBmaWxlOidjbHN4Lm1pbi5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdyZWR1eCcsIG1vZFBhdGg6Jy4uL2Rpc3QnLCBmaWxlRGV2ZWxvcG1lbnQ6J3JlZHV4LmpzJywgZmlsZToncmVkdXgubWluLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ3JlYWN0LXJlZHV4JywgbW9kUGF0aDonLi4vZGlzdCcsIGZpbGVEZXZlbG9wbWVudDoncmVhY3QtcmVkdXguanMnLCBmaWxlOidyZWFjdC1yZWR1eC5taW4uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnbWVtb2l6ZS1vbmUnLCAgZmlsZTonbWVtb2l6ZS1vbmUuanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncXJjb2RlJywgbW9kUGF0aDogJy4uL2J1aWxkJywgZmlsZTogJ3FyY29kZS5qcyd9LFxyXG4gICAgICAgICAgICAuLi5zdXBlci5jbGllbnRJbmNsdWRlcyhyZXEsIG9wdHMpLmZpbHRlcihtPT5tLmZpbGUhPSdmb3JtdWxhcmlvcy5jc3MnKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihtPT5sb2dnZWQgfHwgdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJiYgbS5maWxlIT0nb3BlcmF0aXZvcy5qcycgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8mJiBtLmZpbGUhPSdtZXRhLWVuYy5qcydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyYmIG0uZmlsZSE9J2RhdG9zLWV4dC5qcydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyYmIG0uZmlsZSE9J2NvbnNpc3RlbmNpYXMuanMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbS5maWxlIT0ndmFyLWNhbC5qcydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtLmZpbGUhPSd2YXItY2FsLmpzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJiYgbS5maWxlIT0ndmFyY2FsLmpzJ1xyXG4gICAgICAgICAgICAgICAgLy8pXHJcbiAgICAgICAgICAgICAgICAvLy5maWx0ZXIobT0+bG9nZ2VkIHx8IHRydWVcclxuICAgICAgICAgICAgICAgIC8vICAgICYmIG0uZmlsZSE9J29wZXJhdGl2b3MuanMnIFxyXG4gICAgICAgICAgICAgICAgLy8gICAgJiYgbS5maWxlIT0nbWV0YS1lbmMuanMnXHJcbiAgICAgICAgICAgICAgICAvLyAgICAmJiBtLmZpbGUhPSdkYXRvcy1leHQuanMnXHJcbiAgICAgICAgICAgICAgICAvLyAgICAmJiBtLmZpbGUhPSdjb25zaXN0ZW5jaWFzLmpzJ1xyXG4gICAgICAgICAgICAgICAgLy8gICAgJiYgbS5maWxlIT0ndmFyY2FsLmpzJ1xyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdzZXJ2aWNlLXdvcmtlci1hZG1pbicsICBmaWxlOidzZXJ2aWNlLXdvcmtlci1hZG1pbi5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdyZWR1eC10eXBlZC1yZWR1Y2VyJywgbW9kUGF0aDonLi4vZGlzdCcsIGZpbGU6J3JlZHV4LXR5cGVkLXJlZHVjZXIuanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgc3JjOiAnYWRhcHQuanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgc3JjOiAndGlwb3MuanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgc3JjOiAnYnlwYXNzLWZvcm11bGFyaW8uanMnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgc3JjOiAncmVkdXgtZm9ybXVsYXJpby5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBzcmM6ICdyZW5kZXItZ2VuZXJhbC5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBzcmM6ICdyZW5kZXItZm9ybXVsYXJpby5qcycgfSxcclxuICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBzcmM6ICdhYnJpci1mb3JtdWxhcmlvLmpzJyB9LFxyXG4gICAgICAgICAgICB7IHR5cGU6ICdjc3MnLCBmaWxlOiAnbWVudS5jc3MnIH0sXHJcbiAgICAgICAgICAgIHsgdHlwZTogJ2NzcycsIGZpbGU6ICdmb3JtdWxhcmlvLXJlYWN0LmNzcycgfSxcclxuICAgICAgICAgICAgLi4uIG1lbnVlZFJlc291cmNlc1xyXG4gICAgICAgIF1cclxuICAgICAgICByZXR1cm4gcmVzb3VyY2VzXHJcbiAgICAgICAgLy8gLm1hcChtPT4oey4uLm0sIGZpbGU6bS5maWxlRGV2ZWxvcG1lbnR8fG0uZmlsZX0pKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHJlZnJlc2hDYWNoZXMoKXtcclxuICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQgPSB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQgfHwge307XHJcbiAgICAgICAgYXdhaXQgdGhpcy5pbkRiQ2xpZW50KG51bGwsIGFzeW5jIChjbGllbnQpPT57XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWEgPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBzZWxlY3QgKiBmcm9tIG5vX3JlYSBvcmRlciBieSBub19yZWFgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2FjaGVzJyx0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhKVxyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3VwcyA9IChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0IGdydXBvLCBqc29uYl9hZ2codG9fanNvbihyLiopKSBhcyBjb2RpZ29zIGZyb20gbm9fcmVhIHIgZ3JvdXAgYnkgZ3J1cG8gb3JkZXIgYnkgMVxyXG4gICAgICAgICAgICBgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3VwczAgPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCBncnVwbzAgYXMgZ3J1cG8sIGpzb25iX2FnZyh0b19qc29uKHIuKikpIGFzIGNvZGlnb3MgZnJvbSBub19yZWEgciBncm91cCBieSBncnVwbzAgb3JkZXIgYnkgMVxyXG4gICAgICAgICAgICBgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc29sZS5sb2coJ2NhY2hlcyBvaycpO1xyXG4gICAgfVxyXG4gICAgc3FsTm9yZWFDYXNlKGNhbXBvTmVjZXNhcmlvOnN0cmluZyl7XHJcbiAgICAgICAgdmFyIGJlPXRoaXM7XHJcbiAgICAgICAgcmV0dXJuIGBDQVNFICR7YmUuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWEubWFwKHg9PlxyXG4gICAgICAgICAgICBgIFdIRU4ganNvbl9lbmN1ZXN0YSAtPj4gJHtiZS5kYi5xdW90ZUxpdGVyYWwoeC52YXJpYWJsZSl9ID0gJHtiZS5kYi5xdW90ZUxpdGVyYWwoeC52YWxvcil9IFRIRU4gJHtiZS5kYi5xdW90ZUxpdGVyYWwoeFtjYW1wb05lY2VzYXJpb10pfWBcclxuICAgICAgICApLmpvaW4oJycpfSBXSEVOIFRSVUUgVEhFTiBOVUxMIEVORGBcclxuICAgIH1cclxuICAgIGdldENvbnRleHQocmVxOlJlcXVlc3QpOkNvbnRleHR7XHJcbiAgICAgICAgdmFyIGJlID0gdGhpcztcclxuICAgICAgICB2YXIgZmF0aGVyQ29udGV4dCA9IHN1cGVyLmdldENvbnRleHQocmVxKTtcclxuICAgICAgICBpZihmYXRoZXJDb250ZXh0LnVzZXIpe1xyXG4gICAgICAgICAgICBpZihiZS5wZXJtaXNvc1JvbFtyZXEudXNlci5yb2xdPy5zdXBlcnVzZXIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtzdXBlcnVzZXI6dHJ1ZSwgcHVlZGU6IGJlLnBlcm1pc29zU3VwZXJ1c2VyLCAuLi5mYXRoZXJDb250ZXh0fVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7cHVlZGU6IGJlLnBlcm1pc29zUm9sW3JlcS51c2VyLnJvbF0/LnB1ZWRlLCAuLi5mYXRoZXJDb250ZXh0fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7cHVlZGU6YmUucGVybWlzb3NQYXJhTmFkaWUsIC4uLmZhdGhlckNvbnRleHR9O1xyXG4gICAgfVxyXG4gICAgZ2V0Q29udGV4dEZvckR1bXAoKTpDb250ZXh0e1xyXG4gICAgICAgIHZhciBmYXRoZXJDb250ZXh0ID0gc3VwZXIuZ2V0Q29udGV4dEZvckR1bXAoKTtcclxuICAgICAgICByZXR1cm4ge3N1cGVydXNlcjp0cnVlLCBwdWVkZTogdGhpcy5wZXJtaXNvc1N1cGVydXNlciwgLi4uZmF0aGVyQ29udGV4dH07XHJcbiAgICB9XHJcbiAgICBnZXRDbGllbnRTZXR1cEZvclNlbmRUb0Zyb250RW5kKHJlcTpSZXF1ZXN0KXtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci5nZXRDbGllbnRTZXR1cEZvclNlbmRUb0Zyb250RW5kKHJlcSksXHJcbiAgICAgICAgICAgIGlkcGVyOiByZXEudXNlcj8uaWRwZXJcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgIH1cclxuICAgIGNyZWF0ZVJlc291cmNlc0ZvckNhY2hlSnNvbihwYXJhbWV0ZXJzKXtcclxuICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgIHZhciBqc29uUmVzdWx0ID0ge307XHJcbiAgICAgICAgXHJcbiAgICAgICAganNvblJlc3VsdC52ZXJzaW9uID0gQVBQX0RNX1ZFUlNJT047XHJcbiAgICAgICAganNvblJlc3VsdC5hcHBOYW1lID0gJ2RtZW5jdSc7XHJcbiAgICAgICAganNvblJlc3VsdC5jYWNoZT1bXHJcbiAgICAgICAgICAgIFwiY2FtcG9cIixcclxuICAgICAgICAgICAgXCJvZmZsaW5lXCIsXHJcbiAgICAgICAgICAgIFwibGliL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9tYXRlcmlhbC11aS5wcm9kdWN0aW9uLm1pbi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9jbHN4Lm1pbi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9yZWR1eC5taW4uanNcIixcclxuICAgICAgICAgICAgXCJsaWIvcmVhY3QtcmVkdXgubWluLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL21lbW9pemUtb25lLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3FyY29kZS5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9yZXF1aXJlLWJyby5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9jYXN0LWVycm9yLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2xpa2UtYXIuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvYmVzdC1nbG9iYWxzLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2pzb240YWxsLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2pzLXRvLWh0bWwuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvcmVkdXgtdHlwZWQtcmVkdWNlci5qc1wiLFxyXG4gICAgICAgICAgICBcImFkYXB0LmpzXCIsXHJcbiAgICAgICAgICAgIFwidW5sb2dnZWQuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvanMteWFtbC5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi94bHN4LmNvcmUubWluLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL2xhenktc29tZS5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9zcWwtdG9vbHMuanNcIixcclxuICAgICAgICAgICAgXCJkaWFsb2ctcHJvbWlzZS9kaWFsb2ctcHJvbWlzZS5qc1wiLFxyXG4gICAgICAgICAgICBcIm1vbWVudC9taW4vbW9tZW50LmpzXCIsXHJcbiAgICAgICAgICAgIFwicGlrYWRheS9waWthZGF5LmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3BvbHlmaWxscy1icm8uanNcIixcclxuICAgICAgICAgICAgXCJsaWIvYmlnLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3R5cGUtc3RvcmUuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvdHlwZWQtY29udHJvbHMuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvYWpheC1iZXN0LXByb21pc2UuanNcIixcclxuICAgICAgICAgICAgXCJteS1hamF4LmpzXCIsXHJcbiAgICAgICAgICAgIFwibXktc3RhcnQuanNcIixcclxuICAgICAgICAgICAgXCJsaWIvbXktbG9jYWxkYi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9teS13ZWJzcWxkYi5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9teS1sb2NhbGRiLmpzLm1hcFwiLFxyXG4gICAgICAgICAgICBcImxpYi9teS13ZWJzcWxkYi5qcy5tYXBcIixcclxuICAgICAgICAgICAgXCJsaWIvbXktdGhpbmdzLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL215LXRhYmxlcy5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9teS1pbmZvcm0tbmV0LXN0YXR1cy5qc1wiLFxyXG4gICAgICAgICAgICBcImxpYi9teS1tZW51LmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL215LXNraW4uanNcIixcclxuICAgICAgICAgICAgXCJsaWIvY2xpZW50ZS1lbi1jYXN0ZWxsYW5vLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3NlcnZpY2Utd29ya2VyLWFkbWluLmpzXCIsXHJcbiAgICAgICAgICAgIFwibGliL3JlZHV4LXR5cGVkLXJlZHVjZXIuanNcIixcclxuICAgICAgICAgICAgXCJjbGllbnRfbW9kdWxlcy9vcGVyYXRpdm9zLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvdmFyY2FsLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvZm9ybS1zdHJ1Y3R1cmUuanNcIixcclxuICAgICAgICAgICAgXCJjbGllbnRfbW9kdWxlcy9tZXRhLWVuYy5qc1wiLFxyXG4gICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL2RhdG9zLWV4dC5qc1wiLFxyXG4gICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL2NvbnNpc3RlbmNpYXMuanNcIixcclxuICAgICAgICAgICAgXCJjbGllbnRfbW9kdWxlcy9wcm9jZXNhbWllbnRvLmpzXCIsXHJcbiAgICAgICAgICAgIFwidGlwb3MuanNcIixcclxuICAgICAgICAgICAgXCJieXBhc3MtZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICBcInJlZHV4LWZvcm11bGFyaW8uanNcIixcclxuICAgICAgICAgICAgXCJyZW5kZXItZ2VuZXJhbC5qc1wiLFxyXG4gICAgICAgICAgICBcInJlbmRlci1mb3JtdWxhcmlvLmpzXCIsXHJcbiAgICAgICAgICAgIFwiYWJyaXItZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL3Jvdy12YWxpZGF0b3IuanNcIixcclxuICAgICAgICAgICAgXCJjbGllbnQvbWVudS5qc1wiLFxyXG4gICAgICAgICAgICBcImNsaWVudC9tZW51LmpzXCIsXHJcbiAgICAgICAgICAgIFwiaW1nL2xvZ28ucG5nXCIsXHJcbiAgICAgICAgICAgIC8vXCJpbWcvbG9nby1kbS5wbmdcIixcclxuICAgICAgICAgICAgXCJpbWcvbG9nby0xMjgucG5nXCIsXHJcbiAgICAgICAgICAgIFwiaW1nL21haW4tbG9hZGluZy5naWZcIixcclxuICAgICAgICAgICAgXCJpbWcvYm9ycmFyLXZhbG9yLnBuZ1wiLFxyXG4gICAgICAgICAgICBcImltZy9mb25kby1zYWx0ZWFkby1lcnJvci5wbmdcIixcclxuICAgICAgICAgICAgXCJpbWcvZm9uZG8tc2FsdGVhZG8ucG5nXCIsXHJcbiAgICAgICAgICAgIFwiaW1nL2ZvbmRvLXNhbHRlYWRvLnBuZ1wiLFxyXG4gICAgICAgICAgICBcImltZy9iYWNrZ3JvdW5kLXRlc3QucG5nXCIsXHJcbiAgICAgICAgICAgIFwiY2xpZW50LXNldHVwXCIsXHJcbiAgICAgICAgICAgIFwiY3NzL2Jvb3RzdHJhcC5taW4uY3NzXCIsXHJcbiAgICAgICAgICAgIFwiY3NzL2Zvcm11bGFyaW8tcmVhY3QuY3NzXCIsXHJcbiAgICAgICAgICAgIFwicGlrYWRheS9waWthZGF5LmNzc1wiLFxyXG4gICAgICAgICAgICBcImRpYWxvZy1wcm9taXNlL2RpYWxvZy1wcm9taXNlLmNzc1wiLFxyXG4gICAgICAgICAgICBcInJlbC1lbmMvZXN0YWRvcy5jc3NcIixcclxuICAgICAgICAgICAgXCJjc3MvbXktdGFibGVzLmNzc1wiLFxyXG4gICAgICAgICAgICBcImNzcy9teS1tZW51LmNzc1wiLFxyXG4gICAgICAgICAgICBcImNzcy9teS10aGluZ3MuY3NzXCIsXHJcbiAgICAgICAgICAgIFwiY3NzL21lbnUuY3NzXCIsXHJcbiAgICAgICAgICAgIFwicmVsLWVuYy9teS10aGluZ3MyLmNzc1wiLFxyXG4gICAgICAgICAgICBcImNzcy9mb3JtdWxhcmlvLXJlYWN0LmNzc1wiLFxyXG4gICAgICAgICAgICBcImNzcy9Sb2JvdG8tUmVndWxhci50dGZcIlxyXG4gICAgICAgIF1cclxuICAgICAgICBqc29uUmVzdWx0LmZhbGxiYWNrPVtcclxuICAgICAgICAgICAge1wicGF0aFwiOlwibG9naW5cIiwgXCJmYWxsYmFja1wiOlwib2ZmbGluZVwifSxcclxuICAgICAgICAgICAge1wicGF0aFwiOlwibG9nb3V0XCIsIFwiZmFsbGJhY2tcIjpcIm9mZmxpbmVcIn0sXHJcbiAgICAgICAgICAgIHtcInBhdGhcIjpcImxvZ2luI2k9c2luY3Jvbml6YXJcIiwgXCJmYWxsYmFja1wiOlwib2ZmbGluZVwifSxcclxuICAgICAgICAgICAge1wicGF0aFwiOlwibWVudSNpPXNpbmNyb25pemFyXCIsIFwiZmFsbGJhY2tcIjpcIm9mZmxpbmVcIn1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHJldHVybiBqc29uUmVzdWx0XHJcbiAgICB9XHJcbiAgICBnZXRNZW51KGNvbnRleHQ6Q29udGV4dCl7XHJcbiAgICAgICAgbGV0IG1lbnU6TWVudUluZm9CYXNlW10gPSBbXTtcclxuICAgICAgICBpZih0aGlzLmNvbmZpZy5zZXJ2ZXIucG9saWN5PT0nd2ViJyl7XHJcbiAgICAgICAgICAgIGlmKGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcy5yZWxldmFyKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY29uZmlnWydjbGllbnQtc2V0dXAnXS5hbWJpZW50ZT09J2RlbW8nIHx8IHRoaXMuY29uZmlnWydjbGllbnQtc2V0dXAnXS5hbWJpZW50ZT09J3Rlc3QnIHx8IHRoaXMuY29uZmlnWydjbGllbnQtc2V0dXAnXS5hbWJpZW50ZT09J2NhcGEnKXtcclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goe21lbnVUeXBlOidkZW1vJywgbmFtZTonZGVtbycsIHNlbGVjdGVkQnlEZWZhdWx0OnRydWV9KVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKHttZW51VHlwZToncGF0aCcsIG5hbWU6J3JlbGV2YW1pZW50bycsIHBhdGg6Jy9jYW1wbyd9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonc2luY3Jvbml6YXJfZG0nLCBuYW1lOidzaW5jcm9uaXphcid9LFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZihjb250ZXh0LnB1ZWRlPy5jYW1wbz8uZWRpdGFyKXtcclxuICAgICAgICAgICAgICAgIG1lbnUucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J2FicmlyX2VuY3Vlc3RhJywgbmFtZTonYWJyaXJfZW5jdWVzdGEnfSxcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIG1lbnUucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J21lbnUnLCBuYW1lOidyZWNlcGNpb24nLCBsYWJlbDoncmVjZXBjacOzbicgLG1lbnVDb250ZW50OltcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J21pc19hcmVhcycsIHRhYmxlOidhcmVhcycsIGZmOntyZWNlcGNpb25pc3RhOmNvbnRleHQudXNlci5pZHBlcn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTonbWlzX2VuY3Vlc3RhZG9yZXMnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J2FyZWFzJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOid0ZW1fcmVjZXBjaW9uJywgbGFiZWw6J1RFTSd9LFxyXG4gICAgICAgICAgICAgICAgICAgIF19LCAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY29udGV4dCB1c2VyXCIsIGNvbnRleHQudXNlcilcclxuICAgICAgICAgICAgaWYoY29udGV4dC5zdXBlcnVzZXIpe1xyXG4gICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTonbWVudScsIG5hbWU6J2NvbnRyb2wnLCBtZW51Q29udGVudDpbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidyZXN1bWVuJywgdGFibGU6J2NvbnRyb2xfcmVzdW1lbicsIHNlbGVjdGVkQnlEZWZhdWx0OnRydWV9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTonZG9taW5pbycsIHRhYmxlOidjb250cm9sX2NhbXBvJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOid6b25hJyAgICwgdGFibGU6J2NvbnRyb2xfY2FtcG9fem9uYScgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidjb211bmEnICwgdGFibGU6J2NvbnRyb2xfY2FtcG9fY29tdW5hJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOifDoXJlYScgICAsIHRhYmxlOidjb250cm9sX2NhbXBvX2FyZWEnICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZToncGFydGljaXBhY2lvbicgICAgICAgICwgdGFibGU6J2NvbnRyb2xfY2FtcG9fcGFydGljaXBhY2lvbicgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgXX0sICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoY29udGV4dC5zdXBlcnVzZXIpe1xyXG4gICAgICAgICAgICAgICAgbWVudSA9IFsgLi4ubWVudSxcclxuICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J21lbnUnLCBuYW1lOidjb25maWd1cmFyJywgbWVudUNvbnRlbnQ6W1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J21lbnUnLCBuYW1lOidtdWVzdHJhJywgbGFiZWw6J211ZXN0cmEnLCBtZW51Q29udGVudDpbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTondGVtJywgbGFiZWw6ICdURU0nfSAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTondGFyZWFzJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZToncmVzdWx0YWRvc190YXJlYSd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB7bWVudVR5cGU6J3RhYmxlJywgbmFtZToncGVyc29uYWxfcm9sJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J21lbnUnLCBuYW1lOidtZXRhZGF0b3MnLCBtZW51Q29udGVudDpbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTonb3BlcmF0aXZvcyd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J2Zvcm11bGFyaW9zJyAsIHRhYmxlOidjYXNpbGxlcm9zX3ByaW5jaXBhbGVzJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZToncGxhbm8nICAgICAgICwgdGFibGU6J2Nhc2lsbGVyb3MnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOid0aXBvYycgICAgICAgLCBsYWJlbDondGlwb3MgZGUgY2VsZGFzJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZTondGlwb2NfdGlwb2MnICwgbGFiZWw6J2luY2x1c2lvbmVzIGRlIGNlbGRhcyd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3BhcmFtZXRyb3MnfSxcclxuICAgICAgICAgICAgICAgICAgICBdfSxcclxuICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J21lbnUnLCBuYW1lOid1c3VhcmlvcycsIG1lbnVDb250ZW50OltcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3VzdWFyaW9zJywgc2VsZWN0ZWRCeURlZmF1bHQ6dHJ1ZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHttZW51VHlwZTondGFibGUnLCBuYW1lOidyb2xlcyd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWVudVR5cGU6J3RhYmxlJywgbmFtZToncGVybWlzb3MnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3JvbGVzX3Blcm1pc29zJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgXX0sXHJcbiAgICAgICAgICAgICAgICAgICAgLy8ge21lbnVUeXBlOidwcm9jJywgbmFtZTonZ2VuZXJhdGVfdGFibGVkZWYnLCBwcm9jOid0YWJsZWRlZl9nZW5lcmF0ZScsIGxhYmVsOidnZW5lcmFyIHRhYmxhcycgIH0sXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHttZW51fTtcclxuICAgIH1cclxuICAgIHByZXBhcmVHZXRUYWJsZXMoKXtcclxuICAgICAgICB2YXIgYmU9dGhpcztcclxuICAgICAgICBzdXBlci5wcmVwYXJlR2V0VGFibGVzKCk7XHJcbiAgICAgICAgdGhpcy5nZXRUYWJsZURlZmluaXRpb249e1xyXG4gICAgICAgICAgICAuLi50aGlzLmdldFRhYmxlRGVmaW5pdGlvblxyXG4gICAgICAgICAgICAsIHJvbGVzXHJcbiAgICAgICAgICAgICwgdXN1YXJpb3NcclxuICAgICAgICAgICAgLCBwZXJzb25hbFxyXG4gICAgICAgICAgICAsIHJlY2VwY2lvbmlzdGFzXHJcbiAgICAgICAgICAgICwgZW5jdWVzdGFkb3Jlc1xyXG4gICAgICAgICAgICAsIG1pc19lbmN1ZXN0YWRvcmVzXHJcbiAgICAgICAgICAgICwgcmVjdXBlcmFkb3Jlc1xyXG4gICAgICAgICAgICAsIHN1cGVydmlzb3Jlc1xyXG4gICAgICAgICAgICAsIHBlcnNvbmFsX3JvbFxyXG4gICAgICAgICAgICAsIHBlcm1pc29zXHJcbiAgICAgICAgICAgICwgcm9sZXNfcGVybWlzb3NcclxuICAgICAgICAgICAgLCByb2xlc19zdWJvcmRpbmFkb3NcclxuICAgICAgICAgICAgLCBub19yZWFcclxuICAgICAgICAgICAgLCBzZW1hbmFzXHJcbiAgICAgICAgICAgICwgdGVtOiB0ZW1cclxuICAgICAgICAgICAgLCB0ZW1fcmVjZXBjaW9uXHJcbiAgICAgICAgICAgICwgcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICAsIG9wZXJhY2lvbmVzXHJcbiAgICAgICAgICAgICwgY29tdW5hc1xyXG4gICAgICAgICAgICAsIGFyZWFzXHJcbiAgICAgICAgICAgICwgc2luY3Jvbml6YWNpb25lc1xyXG4gICAgICAgICAgICAsIHRhcmVhc1xyXG4gICAgICAgICAgICAsIHJlc3VsdGFkb3NfdGFyZWFcclxuICAgICAgICAgICAgLCB0YXJlYXNfdGVtOiB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICwgdGFyZWFzX2FyZWFzXHJcbiAgICAgICAgICAgICwgbWlzX3RhcmVhc1xyXG4gICAgICAgICAgICAsIG1pc190YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICwgbWlzX3RhcmVhc19hcmVhc1xyXG4gICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9cclxuICAgICAgICAgICAgLCBjb250cm9sX3Jlc3VtZW5cclxuICAgICAgICAgICAgLCBjb250cm9sX2NhbXBvX3pvbmE6IGNvbnRleHQ9PmNvbnRyb2xfY2FtcG8oY29udGV4dCwgXHJcbiAgICAgICAgICAgICAgICB7bm9tYnJlOidjb250cm9sX2NhbXBvX2NvbXVuYScsIHRpdGxlOidjb250cm9sIGNhbXBvIHggem9uYSBzb2xvIGNlbWVudG8nLCBjYW1wb3NDb3J0ZTpbe25hbWU6J3pvbmEnLCB0eXBlTmFtZTondGV4dCd9XSwgZmlsdHJvV2hlcmU6J3RydWUnIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fY29tdW5hOiBjb250ZXh0PT5jb250cm9sX2NhbXBvKGNvbnRleHQsIFxyXG4gICAgICAgICAgICAgICAge25vbWJyZTonY29udHJvbF9jYW1wb19jb211bmEnLCB0aXRsZTonY29udHJvbCBjYW1wbyB4IGNvbXVuYSBzb2xvIGNlbWVudG8nLCBjYW1wb3NDb3J0ZTpbe25hbWU6J3pvbmEnLCB0eXBlTmFtZTondGV4dCd9LHtuYW1lOiducm9jb211bmEnLCB0eXBlTmFtZTonaW50ZWdlcid9XSwgZmlsdHJvV2hlcmU6J3RydWUnIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fYXJlYTogY29udGV4dD0+Y29udHJvbF9jYW1wbyhjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgIHtub21icmU6J2NvbnRyb2xfY2FtcG9fY29tdW5hJywgdGl0bGU6J2NvbnRyb2wgY2FtcG8geCBhcmVhJywgY2FtcG9zQ29ydGU6W3tuYW1lOid6b25hJywgdHlwZU5hbWU6J3RleHQnfSx7bmFtZTonbnJvY29tdW5hJywgdHlwZU5hbWU6J2ludGVnZXInfSx7bmFtZTonYXJlYScsIHR5cGVOYW1lOidpbnRlZ2VyJ30se25hbWU6J3BhcnRpY2lwYWNpb25fYScsIHR5cGVOYW1lOid0ZXh0J30se25hbWU6J2NsYXNlX2EnLCB0eXBlTmFtZTondGV4dCd9XX1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAsIGNvbnRyb2xfY2FtcG9fcGFydGljaXBhY2lvbjogY29udGV4dD0+Y29udHJvbF9jYW1wbyhjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgIHtub21icmU6J2NvbnRyb2xfY2FtcG9fY29tdW5hJywgdGl0bGU6J2NvbnRyb2wgY2FtcG8geCBwYXJ0aWNpcGFjaW9uJywgY2FtcG9zQ29ydGU6W3tuYW1lOidwYXJ0aWNpcGFjaW9uJywgdHlwZU5hbWU6J2JpZ2ludCd9XX1cclxuICAgICAgICAgICAgKSxcclxuICAgICAgICB9XHJcbiAgICAgICAgYmUuYXBwZW5kVG9UYWJsZURlZmluaXRpb24oJ2NvbnNpc3RlbmNpYXMnLGZ1bmN0aW9uKHRhYmxlRGVmLCBjb250ZXh0KXtcclxuICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpe1xyXG4gICAgICAgICAgICAgICAgaWYoZmllbGQubmFtZT09J2Vycm9yX2NvbXBpbGFjaW9uJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZmllbGQudmlzaWJsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKiBRVUlUQVIgRVNUTyBlcnJvcl9jb21waWxhY2lvbiB5YSBlcyB2aXNpYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZpc2libGU9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJlLmFwcGVuZFRvVGFibGVEZWZpbml0aW9uKCdpbmNvbnNpc3RlbmNpYXMnLGZ1bmN0aW9uKHRhYmxlRGVmLCBjb250ZXh0KXtcclxuICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLnNwbGljZSgyLDAsXHJcbiAgICAgICAgICAgICAgICB7bmFtZTonaWRfY2FzbycsIHR5cGVOYW1lOid0ZXh0JyAgICwgbGFiZWw6J2Nhc28nICAgLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICAgICAgICAgICAvLyB7bmFtZToncDAnICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJywgbGFiZWw6J3BlcnNvbmEnLCBlZGl0YWJsZTogZmFsc2V9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRhYmxlRGVmLmVkaXRhYmxlPXRhYmxlRGVmLmVkaXRhYmxlIHx8IGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcy5qdXN0aWZpY2FyO1xyXG4gICAgICAgICAgICB0YWJsZURlZi5maWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCl7XHJcbiAgICAgICAgICAgICAgICBpZihmaWVsZC5uYW1lPT0ncGtfaW50ZWdyYWRhJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKGZpZWxkLm5hbWU9PSdqdXN0aWZpY2FjaW9uJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZWRpdGFibGU9Y29udGV4dC5mb3JEdW1wIHx8IGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcy5qdXN0aWZpY2FyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYmUuYXBwZW5kVG9UYWJsZURlZmluaXRpb24oJ29wZXJhdGl2b3MnLGZ1bmN0aW9uKHRhYmxlRGVmLCBjb250ZXh0KXtcclxuICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLnNwbGljZSgyLDAse1xyXG4gICAgICAgICAgICAgICAgbmFtZTonY29uZmlnX3NvcnRlbycsIFxyXG4gICAgICAgICAgICAgICAgdHlwZU5hbWU6J2pzb25iJyxcclxuICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLnNwbGljZSgzLDAse1xyXG4gICAgICAgICAgICAgICAgbmFtZTonZGlzZm9ybV9jZXJyYWRvJywgXHJcbiAgICAgICAgICAgICAgICB0eXBlTmFtZTonYm9vbGVhbicsIFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSwgXHJcbiAgICAgICAgICAgICAgICBlZGl0YWJsZTogY29udGV4dC5mb3JEdW1wfHxbJ2FkbWluJywnZGlzX2NvbmNlcHR1YWwnXS5pbmNsdWRlcyhjb250ZXh0LnVzZXIucm9sKX1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbignY2FzaWxsZXJvcycsZnVuY3Rpb24odGFibGVEZWYsIGNvbnRleHQpe1xyXG4gICAgICAgIC8vICAgICB0YWJsZURlZi5jb25zdHJhaW50cyA9IHRhYmxlRGVmLmNvbnN0cmFpbnRzLmZpbHRlcihjPT5jLmNvbnNOYW1lIT0nY2FzaWxsZXJvcyBzYWx0byBSRUwnKVxyXG4gICAgICAgIC8vIH0pXHJcbiAgICB9XHJcbiAgfVxyXG59Il19
|