contable 0.0.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/LICENSE +21 -0
- package/README.md +1 -0
- package/dist/client/client.js +259 -0
- package/dist/client/img/bannersuperior.png +0 -0
- package/dist/client/menu.js +3 -0
- package/dist/client/redux-formulario.js +379 -0
- package/dist/client/render-components.js +750 -0
- package/dist/client/render-components.tsx +1117 -0
- package/dist/client/render-formulario.js +56 -0
- package/dist/client/render-formulario.tsx +72 -0
- package/dist/client/render-general.js +197 -0
- package/dist/client/render-general.tsx +212 -0
- package/dist/client/render-handlers.js +69 -0
- package/dist/client/tipos.js +13 -0
- package/dist/client/tsconfig.json +12 -0
- package/dist/server/app-contable.js +174 -0
- package/dist/server/def-config.js +100 -0
- package/dist/server/procedures-contable.js +508 -0
- package/dist/server/server-contable.js +17 -0
- package/dist/server/table-categorias_producto.js +29 -0
- package/dist/server/table-clientes.js +56 -0
- package/dist/server/table-condicion_iva.js +29 -0
- package/dist/server/table-estados_pedido.js +33 -0
- package/dist/server/table-estados_presupuesto.js +34 -0
- package/dist/server/table-insumos.js +44 -0
- package/dist/server/table-items_pedido.js +48 -0
- package/dist/server/table-items_presupuesto.js +48 -0
- package/dist/server/table-iva_productos.js +29 -0
- package/dist/server/table-parametros.js +38 -0
- package/dist/server/table-pedidos.js +48 -0
- package/dist/server/table-pedidos_pendientes.js +28 -0
- package/dist/server/table-pedidos_vencidos.js +28 -0
- package/dist/server/table-presupuestos.js +56 -0
- package/dist/server/table-productos.js +70 -0
- package/dist/server/table-productos_clientes.js +22 -0
- package/dist/server/table-productos_generales.js +22 -0
- package/dist/server/table-productos_insumos.js +47 -0
- package/dist/server/table-usuarios.js +44 -0
- package/dist/server/tsconfig.json +10 -0
- package/dist/server/types-contable.js +28 -0
- package/dist/unlogged/adapt.js +8 -0
- package/dist/unlogged/css/styles.styl +88 -0
- package/dist/unlogged/img/login-logo-icon.png.png +0 -0
- package/dist/unlogged/img/logo.png +0 -0
- package/dist/unlogged/tsconfig.json +15 -0
- package/dist/unlogged/unlogged.js +205 -0
- package/install/categorias_producto.tab +2 -0
- package/install/condicion_iva.tab +3 -0
- package/install/estados_pedido.tab +5 -0
- package/install/estados_presupuesto.tab +5 -0
- package/install/iva_productos.tab +3 -0
- package/install/productos.tab +2 -0
- package/install/usuarios.tab +2 -0
- package/package.json +58 -0
- package/unlogged/img/main-loading.gif +0 -0
- package/unlogged/main-loading.gif +0 -0
- package/unlogged/my-skin.js +0 -0
|
@@ -0,0 +1,750 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
23
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
+
function step(op) {
|
|
26
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
29
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
+
switch (op[0]) {
|
|
31
|
+
case 0: case 1: t = op; break;
|
|
32
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
+
default:
|
|
36
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
+
if (t[2]) _.ops.pop();
|
|
41
|
+
_.trys.pop(); continue;
|
|
42
|
+
}
|
|
43
|
+
op = body.call(thisArg, _);
|
|
44
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
(function (factory) {
|
|
49
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
50
|
+
var v = factory(require, exports);
|
|
51
|
+
if (v !== undefined) module.exports = v;
|
|
52
|
+
}
|
|
53
|
+
else if (typeof define === "function" && define.amd) {
|
|
54
|
+
define(["require", "exports", "react", "react-dom", "./render-general", "./redux-formulario", "@material-ui/core", "react", "react-redux", "like-ar"], factory);
|
|
55
|
+
}
|
|
56
|
+
})(function (require, exports) {
|
|
57
|
+
"use strict";
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.generarPedidoDesdePresupuesto = exports.ESTADO_ACEPTADO_PRESUPUESTO = void 0;
|
|
60
|
+
exports.Autocompleter = Autocompleter;
|
|
61
|
+
exports.TypedField = TypedField;
|
|
62
|
+
exports.ClienteComponent = ClienteComponent;
|
|
63
|
+
exports.EstadoPresupuesto = EstadoPresupuesto;
|
|
64
|
+
exports.EstadoPedido = EstadoPedido;
|
|
65
|
+
exports.ObservacionesPedido = ObservacionesPedido;
|
|
66
|
+
exports.Items = Items;
|
|
67
|
+
exports.ItemP = ItemP;
|
|
68
|
+
exports.PresupuestoComponent = PresupuestoComponent;
|
|
69
|
+
exports.PedidoComponent = PedidoComponent;
|
|
70
|
+
exports.desplegarPresupuesto = desplegarPresupuesto;
|
|
71
|
+
exports.desplegarPedido = desplegarPedido;
|
|
72
|
+
var React = require("react");
|
|
73
|
+
var ReactDOM = require("react-dom");
|
|
74
|
+
var render_general_1 = require("./render-general");
|
|
75
|
+
var redux_formulario_1 = require("./redux-formulario");
|
|
76
|
+
var core_1 = require("@material-ui/core");
|
|
77
|
+
var react_1 = require("react");
|
|
78
|
+
var react_redux_1 = require("react-redux");
|
|
79
|
+
var likeAr = require("like-ar");
|
|
80
|
+
exports.ESTADO_ACEPTADO_PRESUPUESTO = "aceptado";
|
|
81
|
+
var my = myOwn;
|
|
82
|
+
var generarPedidoDesdePresupuesto = function (datosPresupuesto) {
|
|
83
|
+
var cliente = datosPresupuesto.cliente, items = datosPresupuesto.items, presupuesto = datosPresupuesto.presupuesto;
|
|
84
|
+
var datosPedido = {
|
|
85
|
+
cliente: cliente,
|
|
86
|
+
items: items,
|
|
87
|
+
pedido: __assign({ presupuesto: presupuesto.presupuesto, cliente: presupuesto.cliente, descuento: presupuesto.descuento, subtotal: presupuesto.subtotal, total: presupuesto.total }, (0, redux_formulario_1.inicializarPedido)())
|
|
88
|
+
};
|
|
89
|
+
return datosPedido;
|
|
90
|
+
};
|
|
91
|
+
exports.generarPedidoDesdePresupuesto = generarPedidoDesdePresupuesto;
|
|
92
|
+
my.wScreens.presupuesto = function (addrParams) {
|
|
93
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
94
|
+
var datosPresupuesto, store;
|
|
95
|
+
return __generator(this, function (_a) {
|
|
96
|
+
switch (_a.label) {
|
|
97
|
+
case 0:
|
|
98
|
+
datosPresupuesto = null;
|
|
99
|
+
if (!addrParams.presupuesto) return [3 /*break*/, 2];
|
|
100
|
+
return [4 /*yield*/, my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto })];
|
|
101
|
+
case 1:
|
|
102
|
+
//@ts-ignore existe
|
|
103
|
+
datosPresupuesto = _a.sent();
|
|
104
|
+
_a.label = 2;
|
|
105
|
+
case 2: return [4 /*yield*/, (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPresupuesto: datosPresupuesto || undefined }, redux_formulario_1.createInitialStatePresupuesto)];
|
|
106
|
+
case 3:
|
|
107
|
+
store = _a.sent();
|
|
108
|
+
desplegarPresupuesto(store);
|
|
109
|
+
return [2 /*return*/];
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
my.wScreens.pedido = function (addrParams) {
|
|
115
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
116
|
+
var datosPedido, datosPresupuesto, store;
|
|
117
|
+
return __generator(this, function (_a) {
|
|
118
|
+
switch (_a.label) {
|
|
119
|
+
case 0:
|
|
120
|
+
datosPedido = null;
|
|
121
|
+
if (!addrParams.pedido) return [3 /*break*/, 2];
|
|
122
|
+
return [4 /*yield*/, my.ajax.pedido_cargar({ pedido: addrParams.pedido })];
|
|
123
|
+
case 1:
|
|
124
|
+
//@ts-ignore existe
|
|
125
|
+
datosPedido = _a.sent();
|
|
126
|
+
return [3 /*break*/, 4];
|
|
127
|
+
case 2:
|
|
128
|
+
if (!addrParams.presupuesto) return [3 /*break*/, 4];
|
|
129
|
+
return [4 /*yield*/, my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto })];
|
|
130
|
+
case 3:
|
|
131
|
+
datosPresupuesto = _a.sent();
|
|
132
|
+
datosPedido = (0, exports.generarPedidoDesdePresupuesto)(datosPresupuesto);
|
|
133
|
+
_a.label = 4;
|
|
134
|
+
case 4: return [4 /*yield*/, (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPedido: datosPedido || undefined }, redux_formulario_1.createInitialStatePedido)];
|
|
135
|
+
case 5:
|
|
136
|
+
store = _a.sent();
|
|
137
|
+
desplegarPedido(store);
|
|
138
|
+
return [2 /*return*/];
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
var useStyles = (0, core_1.makeStyles)(function (theme) {
|
|
144
|
+
var _a, _b;
|
|
145
|
+
return ({
|
|
146
|
+
appBar: {
|
|
147
|
+
position: 'relative',
|
|
148
|
+
},
|
|
149
|
+
layout: (_a = {
|
|
150
|
+
width: 'auto',
|
|
151
|
+
marginLeft: theme.spacing(2),
|
|
152
|
+
marginRight: theme.spacing(2)
|
|
153
|
+
},
|
|
154
|
+
_a[theme.breakpoints.up(600 + theme.spacing(2) * 2)] = {
|
|
155
|
+
//width: 600,
|
|
156
|
+
//marginLeft: 'auto',
|
|
157
|
+
//marginRight: 'auto',
|
|
158
|
+
},
|
|
159
|
+
_a),
|
|
160
|
+
paper: (_b = {
|
|
161
|
+
marginTop: theme.spacing(2),
|
|
162
|
+
marginBottom: theme.spacing(2),
|
|
163
|
+
padding: theme.spacing(2)
|
|
164
|
+
},
|
|
165
|
+
_b[theme.breakpoints.up(600 + theme.spacing(3) * 2)] = {
|
|
166
|
+
marginTop: theme.spacing(2),
|
|
167
|
+
marginBottom: theme.spacing(2),
|
|
168
|
+
padding: theme.spacing(3),
|
|
169
|
+
},
|
|
170
|
+
_b),
|
|
171
|
+
stepper: {
|
|
172
|
+
padding: theme.spacing(3, 0, 5),
|
|
173
|
+
},
|
|
174
|
+
buttons: {
|
|
175
|
+
display: 'flex',
|
|
176
|
+
justifyContent: 'flex-end',
|
|
177
|
+
},
|
|
178
|
+
button: {
|
|
179
|
+
marginTop: theme.spacing(1),
|
|
180
|
+
marginBottom: theme.spacing(1),
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
function Autocompleter(props) {
|
|
185
|
+
var rows = props.rows, value = props.value, searchKey = props.searchKey, searchType = props.searchType, onSelection = props.onSelection, id = props.id, className = props.className, label = props.label, name = props.name, matchInListConditionCallback = props.matchInListConditionCallback;
|
|
186
|
+
var anchorRef = (0, react_1.useRef)(null);
|
|
187
|
+
var _a = (0, react_1.useState)([]), filteredRows = _a[0], setFilteredRows = _a[1];
|
|
188
|
+
var _b = (0, react_1.useState)(false), open = _b[0], setOpen = _b[1];
|
|
189
|
+
var _c = (0, react_1.useState)(false), focusOnList = _c[0], setFocusOnList = _c[1];
|
|
190
|
+
var _d = (0, react_1.useState)(null), valorIngresado = _d[0], setValorIngresado = _d[1];
|
|
191
|
+
(0, react_1.useEffect)(function () {
|
|
192
|
+
setValorIngresado(value);
|
|
193
|
+
}, [value]);
|
|
194
|
+
(0, react_1.useEffect)(function () {
|
|
195
|
+
document.body.style.overflow = open ? 'hidden' : 'unset';
|
|
196
|
+
});
|
|
197
|
+
var focusToId = function (id, opts, cb) {
|
|
198
|
+
var element = document.getElementById(id);
|
|
199
|
+
var padre = element;
|
|
200
|
+
while (padre && padre.className != 'pregunta' && padre != document.body)
|
|
201
|
+
padre = padre.parentElement;
|
|
202
|
+
if (padre && padre.className == 'pregunta')
|
|
203
|
+
element = padre;
|
|
204
|
+
if (element) {
|
|
205
|
+
if (cb) {
|
|
206
|
+
cb(element);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
element.focus();
|
|
210
|
+
if (opts.moveToElement) {
|
|
211
|
+
element.scrollIntoView();
|
|
212
|
+
window.scroll({ behavior: opts.moveBehavior || 'auto', top: window.scrollY - 100, left: 0 });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
var checkIfValue = function () {
|
|
218
|
+
var result = rows.find(function (row) { return row[searchKey].toString().toLowerCase() == (valorIngresado || '').toLowerCase(); });
|
|
219
|
+
if (result) {
|
|
220
|
+
setValorIngresado(result[searchKey]);
|
|
221
|
+
onSelection(result);
|
|
222
|
+
setOpen(false);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
setValorIngresado(null);
|
|
226
|
+
setFilteredRows([]);
|
|
227
|
+
onSelection(null);
|
|
228
|
+
setOpen(false);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
var handleClose = function (event) {
|
|
232
|
+
if (anchorRef.current && anchorRef.current.contains(event.target)) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
checkIfValue();
|
|
236
|
+
//y al borrar con backspace primero marca si no está marcado y después borra
|
|
237
|
+
focusToId(id, { moveToElement: false });
|
|
238
|
+
};
|
|
239
|
+
var handleSelection = function (row) {
|
|
240
|
+
onSelection(row);
|
|
241
|
+
setValorIngresado(row[searchKey]);
|
|
242
|
+
setFilteredRows([]);
|
|
243
|
+
setOpen(false);
|
|
244
|
+
focusToId(id, { moveToElement: false });
|
|
245
|
+
};
|
|
246
|
+
return React.createElement(React.Fragment, null,
|
|
247
|
+
React.createElement(core_1.TextField, { id: id, className: className, spellCheck: false, autoCapitalize: "off", autoComplete: "off", autoCorrect: "off", multiline: props.multiline, name: name, label: label, ref: anchorRef, fullWidth: true, type: searchType, disabled: props.disabled || false, value: valorIngresado || '', onChange: function (event) {
|
|
248
|
+
var value = event.target.value;
|
|
249
|
+
setValorIngresado(event.target.value || null);
|
|
250
|
+
setFilteredRows(rows.filter(function (row) {
|
|
251
|
+
return value.split(' ').every(function (palabraBuscada) {
|
|
252
|
+
return row[searchKey].toString().toLocaleLowerCase().includes(palabraBuscada.toLocaleLowerCase()) &&
|
|
253
|
+
(matchInListConditionCallback ? matchInListConditionCallback(row) : true);
|
|
254
|
+
});
|
|
255
|
+
}));
|
|
256
|
+
setOpen(event.target.value.length > 1 && filteredRows.length <= 10);
|
|
257
|
+
}, onFocus: function (_event) {
|
|
258
|
+
setFocusOnList(false);
|
|
259
|
+
//setOpen(!!valorIngresado && valorIngresado.length>1);
|
|
260
|
+
}, onBlur: function () {
|
|
261
|
+
if (!open) {
|
|
262
|
+
checkIfValue();
|
|
263
|
+
}
|
|
264
|
+
}, onKeyDown: function (event) {
|
|
265
|
+
//down key
|
|
266
|
+
if (event.keyCode == 40) {
|
|
267
|
+
if (open) {
|
|
268
|
+
setFocusOnList(true);
|
|
269
|
+
}
|
|
270
|
+
//enter key or tab key
|
|
271
|
+
}
|
|
272
|
+
else if ([13, 9].includes(event.keyCode)) {
|
|
273
|
+
checkIfValue();
|
|
274
|
+
}
|
|
275
|
+
}, "aria-controls": open ? 'menu-list-grow' : undefined, "aria-haspopup": "true" }),
|
|
276
|
+
React.createElement(core_1.Popper, { open: open, anchorEl: anchorRef.current, placement: "bottom-start", transition: true }, function (_a) {
|
|
277
|
+
var TransitionProps = _a.TransitionProps, placement = _a.placement;
|
|
278
|
+
return (React.createElement(core_1.Grow, __assign({}, TransitionProps, { style: { transformOrigin: placement === 'bottom' ? 'left top' : 'center bottom' } }),
|
|
279
|
+
React.createElement(core_1.Paper, null,
|
|
280
|
+
React.createElement(core_1.ClickAwayListener, { onClickAway: handleClose },
|
|
281
|
+
React.createElement(core_1.MenuList, { autoFocusItem: focusOnList, id: "menu-list-grow" }, filteredRows.length ?
|
|
282
|
+
filteredRows.map(function (row, i) {
|
|
283
|
+
return React.createElement(core_1.MenuItem, { key: i, value: i, onClick: function () { return handleSelection(row); }, onKeyDown: function (event) {
|
|
284
|
+
//esc key
|
|
285
|
+
if (event.keyCode == 27 && open) {
|
|
286
|
+
setOpen(false);
|
|
287
|
+
focusToId(id, { moveToElement: false });
|
|
288
|
+
}
|
|
289
|
+
//tab
|
|
290
|
+
if (event.keyCode == 9) {
|
|
291
|
+
handleSelection(row);
|
|
292
|
+
}
|
|
293
|
+
} }, row[searchKey]);
|
|
294
|
+
})
|
|
295
|
+
:
|
|
296
|
+
React.createElement(core_1.MenuItem, { key: -1, disabled: true }, "Sin resultados"))))));
|
|
297
|
+
}));
|
|
298
|
+
}
|
|
299
|
+
function TypedField(props) {
|
|
300
|
+
var value = props.value, type = props.type, id = props.id, className = props.className, name = props.name, label = props.label, onChange = props.onChange, matchInList = props.matchInList, disabled = props.disabled, textAlign = props.textAlign, inputAdornment = props.inputAdornment, adornmentPosition = props.adornmentPosition;
|
|
301
|
+
(0, react_1.useEffect)(function () {
|
|
302
|
+
setMyValue(value);
|
|
303
|
+
}, [value]);
|
|
304
|
+
var _a = (0, react_1.useState)(value), myValue = _a[0], setMyValue = _a[1];
|
|
305
|
+
var inputProps = {
|
|
306
|
+
style: { textAlign: textAlign }
|
|
307
|
+
};
|
|
308
|
+
var inputLabelProps = {
|
|
309
|
+
shrink: true,
|
|
310
|
+
};
|
|
311
|
+
var adornmentProps = {};
|
|
312
|
+
var adornment = inputAdornment ? React.createElement(core_1.InputAdornment, { position: "end" }, inputAdornment) : null;
|
|
313
|
+
adornmentPosition == 'start' ?
|
|
314
|
+
adornmentProps.startAdornment = adornment
|
|
315
|
+
:
|
|
316
|
+
adornmentProps.endAdornment = adornment;
|
|
317
|
+
return React.createElement(core_1.TextField, { inputProps: inputProps, spellCheck: false, autoCapitalize: "off", autoComplete: "off", autoCorrect: "off", value: myValue == null ? '' : myValue, disabled: disabled || false, id: id, multiline: props.multiline, className: className, name: name, label: label, type: type, fullWidth: true, onChange: function (event) {
|
|
318
|
+
var value = event.target.value;
|
|
319
|
+
setMyValue(value == '' ? null : value);
|
|
320
|
+
}, onBlur: function () {
|
|
321
|
+
var value = matchInList ? matchInList.find(function (elem) { return elem == myValue; }) : myValue;
|
|
322
|
+
setMyValue(value);
|
|
323
|
+
onChange(myValue);
|
|
324
|
+
}, InputLabelProps: inputLabelProps, InputProps: adornmentProps });
|
|
325
|
+
}
|
|
326
|
+
function ClienteComponent(props) {
|
|
327
|
+
var datosDesde = props.datosDesde;
|
|
328
|
+
var _a = (0, react_redux_1.useSelector)(function (estado) { return ({ clientes: estado.estructura.clientes, condicionesIva: estado.estructura.condicionesIva, clienteActual: estado[datosDesde].cliente }); }), clientes = _a.clientes, condicionesIva = _a.condicionesIva, clienteActual = _a.clienteActual;
|
|
329
|
+
var clientesArr = likeAr(clientes).array();
|
|
330
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
331
|
+
var condicionesIvaArr = likeAr(condicionesIva).array();
|
|
332
|
+
var classes = useStyles();
|
|
333
|
+
return React.createElement(core_1.Paper, { className: classes.paper },
|
|
334
|
+
React.createElement(core_1.Grid, { container: true, spacing: 3 },
|
|
335
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4, md: 1 },
|
|
336
|
+
React.createElement(TypedField, { value: clienteActual.cliente, type: "number", id: "cliente", name: "cliente", label: "Cliente", matchInList: clientesArr.map(function (cliente) { return cliente.cliente; }), disabled: !props.editando, onChange: function (value) {
|
|
337
|
+
var searchResult = null;
|
|
338
|
+
if (value) {
|
|
339
|
+
searchResult = clientesArr.find(function (cliente) { return cliente.cliente == value; }) || null;
|
|
340
|
+
}
|
|
341
|
+
dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign({}, searchResult), datosDesde: datosDesde }));
|
|
342
|
+
} })),
|
|
343
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 8, md: 5 },
|
|
344
|
+
React.createElement(Autocompleter, { rows: clientesArr, value: clienteActual.razon_social || '', id: "razon-social", name: "razon-social", label: "Razon social", searchKey: "razon_social", searchType: "text", disabled: !props.editando, onSelection: function (clienteSeleccionado) { return dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign({}, clienteSeleccionado), datosDesde: datosDesde })); } })),
|
|
345
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 6, md: 3 },
|
|
346
|
+
React.createElement(core_1.FormControl, { fullWidth: true },
|
|
347
|
+
React.createElement(core_1.InputLabel, { id: "condicion_iva_label" }, "Cond. IVA"),
|
|
348
|
+
React.createElement(core_1.Select, { disabled: true, labelId: "condicion_iva_label", id: "condicion_iva", value: clienteActual.condicion_iva || '', onChange: function (event) {
|
|
349
|
+
var condicion_iva = event.target.value || null;
|
|
350
|
+
dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign(__assign({}, clienteActual), { condicion_iva: condicion_iva }), datosDesde: datosDesde }));
|
|
351
|
+
} }, condicionesIvaArr.map(function (condicionIva) {
|
|
352
|
+
return React.createElement(core_1.MenuItem, { key: condicionIva.condicion, value: condicionIva.condicion }, condicionIva.nombre);
|
|
353
|
+
})))),
|
|
354
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 6, md: 3 },
|
|
355
|
+
React.createElement(TypedField, { type: "number", disabled: true, value: clienteActual.cuit_dni, id: "cuit_dni", label: "CUIT/DNI", name: "cuit_dni", onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign(__assign({}, clienteActual), { cuit_dni: Number(value) }), datosDesde: datosDesde })); } }))));
|
|
356
|
+
}
|
|
357
|
+
function EstadoPresupuesto(props) {
|
|
358
|
+
var _a = (0, react_redux_1.useSelector)(function (estado) { return ({ presupuesto: estado.datosPresupuesto.presupuesto, estadosPresupuesto: estado.estructura.estadosPresupuesto }); }), presupuesto = _a.presupuesto, estadosPresupuesto = _a.estadosPresupuesto;
|
|
359
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
360
|
+
var classes = useStyles();
|
|
361
|
+
return React.createElement(core_1.Paper, { className: classes.paper },
|
|
362
|
+
React.createElement(core_1.Grid, { container: true, spacing: 3 },
|
|
363
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
|
|
364
|
+
React.createElement(core_1.FormControl, { fullWidth: true },
|
|
365
|
+
React.createElement(core_1.InputLabel, { id: "estado_label" }, "Estado"),
|
|
366
|
+
React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: presupuesto.estado || '', disabled: true, onChange: function (event) {
|
|
367
|
+
var estado = event.target.value || null;
|
|
368
|
+
dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "estado", valor: estado }));
|
|
369
|
+
} }, estadosPresupuesto
|
|
370
|
+
.map(function (estado) {
|
|
371
|
+
return React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre);
|
|
372
|
+
})))),
|
|
373
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
|
|
374
|
+
React.createElement(TypedField, { type: "date", value: presupuesto.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "fecha", valor: value })); }) })),
|
|
375
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
|
|
376
|
+
React.createElement(TypedField, { type: "date", value: presupuesto.valido_hasta, id: "valido_hasta", label: "valido hasta", name: "valido_hasta", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "valido_hasta", valor: value })); }) }))));
|
|
377
|
+
}
|
|
378
|
+
function EstadoPedido(props) {
|
|
379
|
+
var _a = (0, react_redux_1.useSelector)(function (estado) { return ({ pedido: estado.datosPedido.pedido, estadosPedido: estado.estructura.estadosPedido }); }), pedido = _a.pedido, estadosPedido = _a.estadosPedido;
|
|
380
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
381
|
+
var classes = useStyles();
|
|
382
|
+
return React.createElement(core_1.Paper, { className: classes.paper },
|
|
383
|
+
React.createElement(core_1.Grid, { container: true, spacing: 3 },
|
|
384
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
|
|
385
|
+
React.createElement(core_1.FormControl, { fullWidth: true },
|
|
386
|
+
React.createElement(core_1.InputLabel, { id: "estado_label" }, "Estado"),
|
|
387
|
+
React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: pedido.estado || '', disabled: !props.editando, onChange: function (event) {
|
|
388
|
+
var estado = event.target.value || null;
|
|
389
|
+
dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "estado", valor: estado }));
|
|
390
|
+
} }, estadosPedido.map(function (estado) {
|
|
391
|
+
return React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre);
|
|
392
|
+
})))),
|
|
393
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
|
|
394
|
+
React.createElement(TypedField, { type: "date", value: pedido.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha", valor: value })); }) })),
|
|
395
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
|
|
396
|
+
React.createElement(TypedField, { type: "date", value: pedido.fecha_entrega, id: "fecha_entrega", label: "fecha entrega", name: "fecha_entrega", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha_entrega", valor: value })); }) }))));
|
|
397
|
+
}
|
|
398
|
+
function ObservacionesPedido(props) {
|
|
399
|
+
var pedido = (0, react_redux_1.useSelector)(function (estado) { return ({ pedido: estado.datosPedido.pedido }); }).pedido;
|
|
400
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
401
|
+
var classes = useStyles();
|
|
402
|
+
return React.createElement(core_1.Paper, { className: classes.paper },
|
|
403
|
+
React.createElement(core_1.Grid, { container: true, spacing: 3 },
|
|
404
|
+
React.createElement(core_1.Grid, { item: true, xs: 12, sm: 12 },
|
|
405
|
+
React.createElement(TypedField, { type: "text", disabled: !props.editando, value: pedido.observaciones, id: "observaciones", label: "Observaciones", name: "observaciones", onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "observaciones", valor: value })); } }))));
|
|
406
|
+
}
|
|
407
|
+
function Items(props) {
|
|
408
|
+
var conDescuentoEnItems = props.conDescuentoEnItems, conOpciones = props.conOpciones, datosDesde = props.datosDesde, presupuestoOPedido = props.presupuestoOPedido;
|
|
409
|
+
var _a = (0, react_redux_1.useSelector)(function (estado) { return estado[datosDesde]; }), items = _a.items, cliente = _a.cliente;
|
|
410
|
+
var classes = useStyles();
|
|
411
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
412
|
+
var handleAdd = function () {
|
|
413
|
+
dispatch(redux_formulario_1.dispatchers.ADD_ITEM({ datosDesde: datosDesde }));
|
|
414
|
+
setTimeout(function () { return (0, render_general_1.focusToId)("cantidad_" + (items.length - 1).toString(), { moveToElement: false }); }, 100);
|
|
415
|
+
};
|
|
416
|
+
return React.createElement(core_1.TableContainer, { component: core_1.Paper },
|
|
417
|
+
React.createElement(core_1.Table, { "aria-label": "customized table", id: "items-table" },
|
|
418
|
+
React.createElement(core_1.TableHead, null,
|
|
419
|
+
React.createElement(core_1.TableRow, null,
|
|
420
|
+
React.createElement(StyledTableCell, { style: { width: "50px" }, className: "not-print" }, "Items"),
|
|
421
|
+
React.createElement(StyledTableCell, { style: { width: "55px" } }, "Cantidad"),
|
|
422
|
+
React.createElement(StyledTableCell, { style: { width: "60px" } }, "Cod prod"),
|
|
423
|
+
React.createElement(StyledTableCell, { className: "not-print" }, "Nombre prod"),
|
|
424
|
+
React.createElement(StyledTableCell, null, "Descripcion"),
|
|
425
|
+
React.createElement(StyledTableCell, { style: { width: "80px" }, align: "right" }, "P unitario"),
|
|
426
|
+
conDescuentoEnItems ? React.createElement(StyledTableCell, { style: { width: "40px" }, align: "right" }, "Dto") : null,
|
|
427
|
+
conDescuentoEnItems ? React.createElement(StyledTableCell, { style: { width: "50px" }, align: "right" }, "Bonif") : null,
|
|
428
|
+
React.createElement(StyledTableCell, { style: { width: "80px" }, align: "right" }, "Total"))),
|
|
429
|
+
React.createElement(core_1.TableBody, null,
|
|
430
|
+
items.map(function (item, index) { return (React.createElement(ItemP, { key: index, index: index, item: item, editando: props.editando, cliente: cliente, conDescuentoEnItems: conDescuentoEnItems, datosDesde: datosDesde })); }),
|
|
431
|
+
React.createElement(core_1.TableRow, null,
|
|
432
|
+
React.createElement(StyledTableCell, { className: "not-print" },
|
|
433
|
+
React.createElement(core_1.Button, { size: "small", variant: "outlined", color: "primary", onClick: handleAdd, disabled: !props.editando, onKeyDown: function (event) {
|
|
434
|
+
//enter
|
|
435
|
+
if ([13].includes(event.keyCode)) {
|
|
436
|
+
handleAdd();
|
|
437
|
+
}
|
|
438
|
+
}, className: classes.button },
|
|
439
|
+
React.createElement(render_general_1.ICON.Add, null))),
|
|
440
|
+
React.createElement(StyledTableCell, { className: "not-print" }),
|
|
441
|
+
conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 2 }) : null,
|
|
442
|
+
conOpciones ?
|
|
443
|
+
React.createElement(StyledTableCell, { colSpan: 2, align: "right" })
|
|
444
|
+
:
|
|
445
|
+
React.createElement(React.Fragment, null,
|
|
446
|
+
React.createElement(StyledTableCell, { colSpan: 4, align: "right" }, "subtotal $"),
|
|
447
|
+
React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, presupuestoOPedido.subtotal))),
|
|
448
|
+
conOpciones ? null : React.createElement(React.Fragment, null,
|
|
449
|
+
React.createElement(core_1.TableRow, null,
|
|
450
|
+
React.createElement(StyledTableCell, { className: "not-print" }),
|
|
451
|
+
React.createElement(StyledTableCell, { className: "not-print" }),
|
|
452
|
+
conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 2 }) : null,
|
|
453
|
+
React.createElement(StyledTableCell, { align: "right", colSpan: 4 }, "descuento general $"),
|
|
454
|
+
React.createElement(StyledTableCell, { align: "right" },
|
|
455
|
+
React.createElement(TypedField, { textAlign: "right", type: "number", disabled: !props.editando, value: presupuestoOPedido.descuento, id: "descuento", name: "descuento", onChange: function (value) {
|
|
456
|
+
return datosDesde == 'datosPresupuesto' ?
|
|
457
|
+
dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PRESUPUESTO({ descuento: Number(value) }))
|
|
458
|
+
:
|
|
459
|
+
dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PEDIDO({ descuento: Number(value) }));
|
|
460
|
+
} }))),
|
|
461
|
+
React.createElement(core_1.TableRow, null,
|
|
462
|
+
React.createElement(StyledTableCell, { className: "not-print" }),
|
|
463
|
+
React.createElement(StyledTableCell, { className: "not-print" }),
|
|
464
|
+
conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 3 }) : null,
|
|
465
|
+
React.createElement(StyledTableCell, { align: "right", colSpan: conDescuentoEnItems ? 3 : 4 }, "total $"),
|
|
466
|
+
React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, presupuestoOPedido.total))))));
|
|
467
|
+
}
|
|
468
|
+
function ItemP(props) {
|
|
469
|
+
var _a, _b;
|
|
470
|
+
var productos = (0, react_redux_1.useSelector)(function (estado) { return estado.estructura; }).productos;
|
|
471
|
+
var productosArr = likeAr(productos).array();
|
|
472
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
473
|
+
var item = props.item, index = props.index, conDescuentoEnItems = props.conDescuentoEnItems, cliente = props.cliente, datosDesde = props.datosDesde;
|
|
474
|
+
var classes = useStyles();
|
|
475
|
+
var EDICION_LIBRE = item.producto == 0;
|
|
476
|
+
return React.createElement(core_1.Grow, { in: true },
|
|
477
|
+
React.createElement(StyledTableRow, { key: item.producto },
|
|
478
|
+
React.createElement(StyledTableCell, { className: "not-print" },
|
|
479
|
+
React.createElement(core_1.Button, { id: "agregar_" + index.toString(), size: "small", variant: "outlined", disabled: !props.editando, color: "secondary", onClick: function () {
|
|
480
|
+
dispatch(redux_formulario_1.dispatchers.REMOVE_ITEM({ index: index, datosDesde: datosDesde }));
|
|
481
|
+
}, className: classes.button },
|
|
482
|
+
React.createElement(render_general_1.ICON.DeleteOutline, null))),
|
|
483
|
+
React.createElement(StyledTableCell, { align: "right" },
|
|
484
|
+
React.createElement(TypedField, { id: "cantidad_" + index.toString(), type: "number", value: item.cantidad || null, name: "cantidad", disabled: !props.editando, onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CANTIDAD_ITEM({ index: index, cantidad: Number(value), datosDesde: datosDesde })); } })),
|
|
485
|
+
React.createElement(StyledTableCell, { align: "right" },
|
|
486
|
+
React.createElement(TypedField, { value: item.producto || null, id: "poroducto_" + index.toString(), name: "producto", type: "number", disabled: !props.editando, matchInList: EDICION_LIBRE ? undefined : productosArr.map(function (producto) { return producto.producto; }), onChange: function (value) {
|
|
487
|
+
if (value == '0') {
|
|
488
|
+
dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'producto', valor: value, datosDesde: datosDesde }));
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
var searchResult = null;
|
|
492
|
+
if (value) {
|
|
493
|
+
searchResult = productosArr.find(function (producto) { return producto.producto == value; }) || null;
|
|
494
|
+
}
|
|
495
|
+
dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index: index, producto: searchResult, datosDesde: datosDesde }));
|
|
496
|
+
}
|
|
497
|
+
} })),
|
|
498
|
+
React.createElement(StyledTableCell, { className: "not-print" },
|
|
499
|
+
React.createElement(render_general_1.AltoImpresionStyle, { charsPerLine: conDescuentoEnItems ? 60 : 75, componentId: "nombre-producto_" + index.toString(), lineHeight: 30, value: (item === null || item === void 0 ? void 0 : item.nombre) || '' }),
|
|
500
|
+
React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, __assign({
|
|
501
|
+
value: (item === null || item === void 0 ? void 0 : item.nombre) || '',
|
|
502
|
+
id: "nombre-producto_" + index.toString(),
|
|
503
|
+
name: "nombre-producto",
|
|
504
|
+
disabled: !props.editando,
|
|
505
|
+
multiline: true,
|
|
506
|
+
matchInListConditionCallback: function (producto) {
|
|
507
|
+
return cliente.cliente == producto.cliente || producto.cliente == null;
|
|
508
|
+
}
|
|
509
|
+
}, (EDICION_LIBRE ? {
|
|
510
|
+
onChange: function (value) {
|
|
511
|
+
return dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'nombre', valor: value, datosDesde: datosDesde }));
|
|
512
|
+
}
|
|
513
|
+
} : {
|
|
514
|
+
rows: productosArr,
|
|
515
|
+
searchKey: "nombre",
|
|
516
|
+
searchType: "text",
|
|
517
|
+
onSelection: function (productoSeleccionado) {
|
|
518
|
+
return dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index: index, producto: productoSeleccionado, datosDesde: datosDesde }));
|
|
519
|
+
}
|
|
520
|
+
})))),
|
|
521
|
+
React.createElement(StyledTableCell, null,
|
|
522
|
+
React.createElement(render_general_1.AltoImpresionStyle, { charsPerLine: conDescuentoEnItems ? 60 : 75, componentId: "descripcion-producto_" + index.toString(), lineHeight: 30, value: (item === null || item === void 0 ? void 0 : item.descripcion) || '' }),
|
|
523
|
+
React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, __assign({
|
|
524
|
+
value: (item === null || item === void 0 ? void 0 : item.descripcion) || '',
|
|
525
|
+
id: "descripcion-producto_" + index.toString(),
|
|
526
|
+
name: "descripcion-producto",
|
|
527
|
+
disabled: !props.editando,
|
|
528
|
+
multiline: true,
|
|
529
|
+
}, (EDICION_LIBRE ? {
|
|
530
|
+
onChange: function (value) {
|
|
531
|
+
return dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'descripcion', valor: value, datosDesde: datosDesde }));
|
|
532
|
+
}
|
|
533
|
+
} : {
|
|
534
|
+
rows: productosArr,
|
|
535
|
+
searchKey: "descripcion",
|
|
536
|
+
searchType: "text",
|
|
537
|
+
onSelection: function (productoSeleccionado) {
|
|
538
|
+
return dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index: index, producto: productoSeleccionado, datosDesde: datosDesde }));
|
|
539
|
+
}
|
|
540
|
+
})))),
|
|
541
|
+
React.createElement(StyledTableCell, { align: "right" }, EDICION_LIBRE ?
|
|
542
|
+
React.createElement(TypedField, { textAlign: "right", id: "precio_unitario" + index.toString(), type: "number", value: item.precio_unitario || null, name: "precio_unitario", disabled: !props.editando, onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'precio_unitario', valor: value, datosDesde: datosDesde })); } })
|
|
543
|
+
:
|
|
544
|
+
(_a = item.precio_unitario) === null || _a === void 0 ? void 0 : _a.toString()),
|
|
545
|
+
conDescuentoEnItems ?
|
|
546
|
+
React.createElement(React.Fragment, null,
|
|
547
|
+
React.createElement(StyledTableCell, { align: "right" },
|
|
548
|
+
React.createElement(TypedField, { textAlign: "right", value: item.porcentaje_descuento || 0, id: "porcentaje_descuento_" + index.toString(), name: "porcentaje_descuento", type: "number", disabled: !props.editando, onChange: function (value) {
|
|
549
|
+
dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_ITEM({ index: index, porcentaje: Number(value), datosDesde: datosDesde }));
|
|
550
|
+
}, inputAdornment: "%" })),
|
|
551
|
+
React.createElement(StyledTableCell, { align: "right" }, item.descuento))
|
|
552
|
+
: null,
|
|
553
|
+
React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, (_b = item.total) === null || _b === void 0 ? void 0 : _b.toString())));
|
|
554
|
+
}
|
|
555
|
+
var StyledTableCell = (0, core_1.withStyles)(function (theme) {
|
|
556
|
+
return (0, core_1.createStyles)({
|
|
557
|
+
head: {
|
|
558
|
+
backgroundColor: theme.palette.common.black,
|
|
559
|
+
color: theme.palette.common.white,
|
|
560
|
+
},
|
|
561
|
+
body: {
|
|
562
|
+
fontSize: 14,
|
|
563
|
+
padding: 8
|
|
564
|
+
},
|
|
565
|
+
});
|
|
566
|
+
})(core_1.TableCell);
|
|
567
|
+
var StyledTableRow = (0, core_1.withStyles)(function (theme) {
|
|
568
|
+
return (0, core_1.createStyles)({
|
|
569
|
+
root: {
|
|
570
|
+
'&:nth-of-type(odd)': {
|
|
571
|
+
backgroundColor: theme.palette.action.hover,
|
|
572
|
+
},
|
|
573
|
+
},
|
|
574
|
+
});
|
|
575
|
+
})(core_1.TableRow);
|
|
576
|
+
function PresupuestoComponent(_props) {
|
|
577
|
+
var _this = this;
|
|
578
|
+
var _a;
|
|
579
|
+
var _b = (0, react_redux_1.useSelector)(function (estado) { return (estado.datosPresupuesto); }), cliente = _b.cliente, presupuesto = _b.presupuesto, items = _b.items;
|
|
580
|
+
var estadosPresupuesto = (0, react_redux_1.useSelector)(function (estado) { return ({ estadosPresupuesto: estado.estructura.estadosPresupuesto }); }).estadosPresupuesto;
|
|
581
|
+
var parametros = (0, react_redux_1.useSelector)(function (estado) { return (estado.estructura); }).parametros;
|
|
582
|
+
var classes = useStyles();
|
|
583
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
584
|
+
var _c = (0, react_1.useState)(false), open = _c[0], setOpen = _c[1];
|
|
585
|
+
var esNuevo = !(presupuesto.presupuesto);
|
|
586
|
+
var disabled = !((_a = estadosPresupuesto.find(function (estado) { return estado.estado == presupuesto.estado; })) === null || _a === void 0 ? void 0 : _a.permite_editar);
|
|
587
|
+
var _d = (0, react_1.useState)(esNuevo), editando = _d[0], setEditando = _d[1];
|
|
588
|
+
var _e = (0, react_1.useState)(''), snackBarMessage = _e[0], setSnackBarMessage = _e[1];
|
|
589
|
+
var hayDescuentosIngresados = items.some(function (item) { return item.descuento != 0; });
|
|
590
|
+
var handleClose = function (_event, reason) {
|
|
591
|
+
if (reason === 'clickaway') {
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
setOpen(false);
|
|
595
|
+
};
|
|
596
|
+
return React.createElement("main", { className: classes.layout, id: "presupuesto" },
|
|
597
|
+
React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
|
|
598
|
+
React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-start", direction: "row" },
|
|
599
|
+
React.createElement("h2", null, presupuesto.presupuesto ? "Presupuesto N\u00BA ".concat(presupuesto.presupuesto) : "Nuevo presupuesto")),
|
|
600
|
+
React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
|
|
601
|
+
React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: function () {
|
|
602
|
+
setEditando(!editando);
|
|
603
|
+
}, disabled: disabled, className: classes.button }, editando ?
|
|
604
|
+
React.createElement(render_general_1.ICON.Cancel, null)
|
|
605
|
+
:
|
|
606
|
+
React.createElement(render_general_1.ICON.Edit, null)),
|
|
607
|
+
React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: function () {
|
|
608
|
+
window.print();
|
|
609
|
+
}, className: classes.button },
|
|
610
|
+
React.createElement(render_general_1.ICON.Print, null))),
|
|
611
|
+
React.createElement(ClienteComponent, { editando: editando, datosDesde: "datosPresupuesto" }),
|
|
612
|
+
React.createElement(EstadoPresupuesto, { editando: editando }),
|
|
613
|
+
React.createElement(Items, { editando: editando, conDescuentoEnItems: presupuesto.con_descuento_en_items, conOpciones: presupuesto.con_opciones, datosDesde: 'datosPresupuesto', presupuestoOPedido: presupuesto }),
|
|
614
|
+
React.createElement(core_1.Grid, { container: true, className: "not-print", alignItems: "flex-start", justify: "flex-end", direction: "row" },
|
|
615
|
+
React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_opciones, onChange: (function (event) {
|
|
616
|
+
return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_opciones", valor: event.target.checked }));
|
|
617
|
+
}), disabled: !editando, name: "con_opciones", color: "primary" }), labelPlacement: "start", label: "ocultar totales" })),
|
|
618
|
+
React.createElement(core_1.Grid, { container: true, className: "not-print", alignItems: "flex-start", justify: "flex-end", direction: "row" },
|
|
619
|
+
React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_descuento_en_items, onChange: (function (event) {
|
|
620
|
+
return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_descuento_en_items", valor: event.target.checked }));
|
|
621
|
+
}), disabled: !editando || hayDescuentosIngresados, name: "con_descuento_en_items", color: "primary" }), labelPlacement: "start", label: "descuento en items" })),
|
|
622
|
+
React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
|
|
623
|
+
React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: function () { return __awaiter(_this, void 0, void 0, function () {
|
|
624
|
+
var result, err_1;
|
|
625
|
+
return __generator(this, function (_a) {
|
|
626
|
+
switch (_a.label) {
|
|
627
|
+
case 0:
|
|
628
|
+
_a.trys.push([0, 2, , 3]);
|
|
629
|
+
return [4 /*yield*/, (0, redux_formulario_1.guardarPresupuesto)(cliente, presupuesto, items)];
|
|
630
|
+
case 1:
|
|
631
|
+
result = _a.sent();
|
|
632
|
+
dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "presupuesto", valor: result.presupuesto }));
|
|
633
|
+
setSnackBarMessage("Presupuesto ".concat(result.presupuesto, " guardado"));
|
|
634
|
+
setOpen(true);
|
|
635
|
+
setEditando(false);
|
|
636
|
+
return [3 /*break*/, 3];
|
|
637
|
+
case 2:
|
|
638
|
+
err_1 = _a.sent();
|
|
639
|
+
setSnackBarMessage("Error al guardar el presupuesto. ".concat(err_1.message));
|
|
640
|
+
setOpen(true);
|
|
641
|
+
return [3 /*break*/, 3];
|
|
642
|
+
case 3: return [2 /*return*/];
|
|
643
|
+
}
|
|
644
|
+
});
|
|
645
|
+
}); }, className: classes.button },
|
|
646
|
+
React.createElement(render_general_1.ICON.Save, null)),
|
|
647
|
+
React.createElement(core_1.Snackbar, { anchorOrigin: {
|
|
648
|
+
vertical: 'bottom',
|
|
649
|
+
horizontal: 'left',
|
|
650
|
+
}, open: open, autoHideDuration: 6000, onClose: handleClose, message: snackBarMessage, action: React.createElement(React.Fragment, null,
|
|
651
|
+
React.createElement(core_1.IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: handleClose },
|
|
652
|
+
React.createElement(render_general_1.ICON.Close, null))) })),
|
|
653
|
+
(parametros === null || parametros === void 0 ? void 0 : parametros.legales_presupuesto) ?
|
|
654
|
+
React.createElement(core_1.Paper, { className: classes.paper + " legales" },
|
|
655
|
+
React.createElement("p", null, parametros.legales_presupuesto))
|
|
656
|
+
:
|
|
657
|
+
null);
|
|
658
|
+
}
|
|
659
|
+
function PedidoComponent(_props) {
|
|
660
|
+
var _this = this;
|
|
661
|
+
var _a = (0, react_redux_1.useSelector)(function (estado) { return (estado.datosPedido); }), cliente = _a.cliente, pedido = _a.pedido, items = _a.items;
|
|
662
|
+
var classes = useStyles();
|
|
663
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
664
|
+
var _b = (0, react_1.useState)(false), open = _b[0], setOpen = _b[1];
|
|
665
|
+
var esNuevo = !(pedido.pedido);
|
|
666
|
+
var _c = (0, react_1.useState)(esNuevo), editando = _c[0], setEditando = _c[1];
|
|
667
|
+
var _d = (0, react_1.useState)(''), snackBarMessage = _d[0], setSnackBarMessage = _d[1];
|
|
668
|
+
var handleClose = function (_event, reason) {
|
|
669
|
+
if (reason === 'clickaway') {
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
setOpen(false);
|
|
673
|
+
};
|
|
674
|
+
return React.createElement("main", { className: classes.layout, id: "pedido" },
|
|
675
|
+
React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
|
|
676
|
+
React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-start", direction: "row" },
|
|
677
|
+
React.createElement("h2", null, pedido.pedido ? "Pedido N\u00BA ".concat(pedido.pedido) : "Nuevo pedido")),
|
|
678
|
+
React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
|
|
679
|
+
React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: function () {
|
|
680
|
+
setEditando(!editando);
|
|
681
|
+
}, className: classes.button }, editando ?
|
|
682
|
+
React.createElement(render_general_1.ICON.Cancel, null)
|
|
683
|
+
:
|
|
684
|
+
React.createElement(render_general_1.ICON.Edit, null)),
|
|
685
|
+
React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: function () {
|
|
686
|
+
window.print();
|
|
687
|
+
}, className: classes.button },
|
|
688
|
+
React.createElement(render_general_1.ICON.Print, null))),
|
|
689
|
+
React.createElement(ClienteComponent, { editando: editando, datosDesde: "datosPedido" }),
|
|
690
|
+
React.createElement(EstadoPedido, { editando: editando }),
|
|
691
|
+
React.createElement(Items, { editando: editando, conDescuentoEnItems: true, conOpciones: false, datosDesde: 'datosPedido', presupuestoOPedido: pedido }),
|
|
692
|
+
React.createElement(ObservacionesPedido, { editando: editando }),
|
|
693
|
+
React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
|
|
694
|
+
React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: function () { return __awaiter(_this, void 0, void 0, function () {
|
|
695
|
+
var result, err_2;
|
|
696
|
+
return __generator(this, function (_a) {
|
|
697
|
+
switch (_a.label) {
|
|
698
|
+
case 0:
|
|
699
|
+
_a.trys.push([0, 2, , 3]);
|
|
700
|
+
return [4 /*yield*/, (0, redux_formulario_1.guardarPedido)(cliente, pedido, items)];
|
|
701
|
+
case 1:
|
|
702
|
+
result = _a.sent();
|
|
703
|
+
dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "pedido", valor: result.pedido }));
|
|
704
|
+
setSnackBarMessage("Pedido ".concat(result.pedido, " guardado"));
|
|
705
|
+
setOpen(true);
|
|
706
|
+
setEditando(false);
|
|
707
|
+
return [3 /*break*/, 3];
|
|
708
|
+
case 2:
|
|
709
|
+
err_2 = _a.sent();
|
|
710
|
+
setSnackBarMessage("Error al guardar el pedido. ".concat(err_2.message));
|
|
711
|
+
setOpen(true);
|
|
712
|
+
return [3 /*break*/, 3];
|
|
713
|
+
case 3: return [2 /*return*/];
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
}); }, className: classes.button },
|
|
717
|
+
React.createElement(render_general_1.ICON.Save, null)),
|
|
718
|
+
React.createElement(core_1.Snackbar, { anchorOrigin: {
|
|
719
|
+
vertical: 'bottom',
|
|
720
|
+
horizontal: 'left',
|
|
721
|
+
}, open: open, autoHideDuration: 6000, onClose: handleClose, message: snackBarMessage, action: React.createElement(React.Fragment, null,
|
|
722
|
+
React.createElement(core_1.IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: handleClose },
|
|
723
|
+
React.createElement(render_general_1.ICON.Close, null))) })));
|
|
724
|
+
}
|
|
725
|
+
function desplegarPresupuesto(store) {
|
|
726
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
727
|
+
return __generator(this, function (_a) {
|
|
728
|
+
ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
|
|
729
|
+
React.createElement(PresupuestoComponent, null)), document.getElementById('main_layout'));
|
|
730
|
+
return [2 /*return*/];
|
|
731
|
+
});
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
function desplegarPedido(store) {
|
|
735
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
736
|
+
return __generator(this, function (_a) {
|
|
737
|
+
ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
|
|
738
|
+
React.createElement(PedidoComponent, null)), document.getElementById('main_layout'));
|
|
739
|
+
return [2 /*return*/];
|
|
740
|
+
});
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
if (typeof window !== 'undefined') {
|
|
744
|
+
// @ts-ignore para hacerlo
|
|
745
|
+
window.desplegarPresupuesto = desplegarPresupuesto;
|
|
746
|
+
// @ts-ignore para hacerlo
|
|
747
|
+
window.desplegarPedido = desplegarPedido;
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWNvbXBvbmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L3JlbmRlci1jb21wb25lbnRzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTBIQSxzQ0EwS0M7SUFDRCxnQ0E2REM7SUFFRCw0Q0EwRUM7SUFFRCw4Q0F1REM7SUFFRCxvQ0FxREM7SUFDRCxrREFxQkM7SUFFRCxzQkEyR0M7SUFFRCxzQkFvSkM7SUF5QkQsb0RBK0lDO0lBRUQsMENBZ0dDO0lBRUQsb0RBUUM7SUFFRCwwQ0FRQztJQXJsQ0QsNkJBQStCO0lBQy9CLG9DQUFzQztJQUN0QyxtREFRMEI7SUFDMUIsdURBQzBIO0lBQzFILDBDQVcyQjtJQUMzQiwrQkFBb0Q7SUFDcEQsMkNBQWlFO0lBQ2pFLGdDQUFrQztJQU1yQixRQUFBLDJCQUEyQixHQUF3QixVQUFVLENBQUM7SUFDM0UsSUFBSSxFQUFFLEdBQUMsS0FBSyxDQUFDO0lBRU4sSUFBSSw2QkFBNkIsR0FBRyxVQUFDLGdCQUFpQztRQUNwRSxJQUFBLE9BQU8sR0FBeUIsZ0JBQWdCLFFBQXpDLEVBQUUsS0FBSyxHQUFrQixnQkFBZ0IsTUFBbEMsRUFBRSxXQUFXLEdBQUssZ0JBQWdCLFlBQXJCLENBQXNCO1FBQ3RELElBQUksV0FBVyxHQUFlO1lBQzFCLE9BQU8sU0FBQTtZQUNQLEtBQUssT0FBQTtZQUNMLE1BQU0sYUFDRixXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFDcEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQzVCLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUNoQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFDOUIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLElBQ3JCLElBQUEsb0NBQWlCLEdBQUUsQ0FDekI7U0FDSixDQUFBO1FBQ0Qs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QUFDLGVBQWUsT0FBRSxDQUNYLEVBRVgsUUFBUSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FDekMsQ0FBQTs7OztLQUNKO0lBRUQsSUFBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUMsQ0FBQztRQUM5QiwwQkFBMEI7UUFDMUIsTUFBTSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBQ25ELDBCQUEwQjtRQUMxQixNQUFNLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcclxuaW1wb3J0IHsgIFxyXG4gICAgRm9jdXNPcHRzLCBSZW5kZXJQcmluY2lwYWwsIFxyXG4gICAgY2xzeCxcclxuICAgIElDT04sXHJcbiAgICBmb2N1c1RvSWQsXHJcbiAgICBzY3JvbGxUb1RvcCxcclxuICAgIHNjcm9sbFRvQm90dG9tLFxyXG4gICAgSW5wdXRUeXBlcywgdG90YWxzU3R5bGVzLCBBbHRvSW1wcmVzaW9uU3R5bGVcclxufSBmcm9tIFwiLi9yZW5kZXItZ2VuZXJhbFwiO1xyXG5pbXBvcnQgeyBkaXNwYXRjaGVycywgY3JlYXJTdG9yZSwgQWN0aW9uRm9ybXVsYXJpb1N0YXRlLCBndWFyZGFyUHJlc3VwdWVzdG8sIFxyXG4gICAgY3JlYXRlSW5pdGlhbFN0YXRlUHJlc3VwdWVzdG8sIGd1YXJkYXJQZWRpZG8sIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbywgaW5pY2lhbGl6YXJQZWRpZG8gfSBmcm9tIFwiLi9yZWR1eC1mb3JtdWxhcmlvXCI7XHJcbmltcG9ydCB7XHJcbiAgICBBcHBCYXIsIEJhZGdlLCBCdXR0b24sIEJ1dHRvbkdyb3VwLCBDYXJkLCBDaGVja2JveCwgQ2hpcCwgQ2lyY3VsYXJQcm9ncmVzcywgQ3NzQmFzZWxpbmUsIFxyXG4gICAgRGlhbG9nLCBEaWFsb2dBY3Rpb25zLCBEaWFsb2dDb250ZW50LCBEaWFsb2dDb250ZW50VGV4dCwgXHJcbiAgICBEaWFsb2dUaXRsZSwgRGl2aWRlciwgRmFiLCBGb3JtQ29udHJvbExhYmVsLCBHcmlkLCBJY29uQnV0dG9uLCBJbnB1dEJhc2UsIElucHV0TGFiZWwsIFxyXG4gICAgTGluaywgTGlzdCwgTGlzdEl0ZW0sIExpc3RJdGVtSWNvbiwgTGlzdEl0ZW1UZXh0LCBEcmF3ZXIsIFxyXG4gICAgTWVudSwgTWVudUl0ZW0sIFBhcGVyLCBQb3BvdmVyLFxyXG4gICAgU2VsZWN0LCBTbmFja2JhciwgU3RlcCwgU3RlcHBlciwgU3RlcENvbnRlbnQsIFN0ZXBMYWJlbCwgXHJcbiAgICBTdmdJY29uLCBTd2l0Y2gsIFxyXG4gICAgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCBUYWJsZUhlYWQsIFRhYmxlUm93LCBUZXh0RmllbGQsIFRoZW1lLCBUb29sYmFyLCBUeXBvZ3JhcGh5LCBab29tLFxyXG4gICAgdXNlU2Nyb2xsVHJpZ2dlcixcclxuICAgIGNyZWF0ZVN0eWxlcywgbWFrZVN0eWxlcywgSWNvbiwgUG9wcGVyLCBHcm93LCBDbGlja0F3YXlMaXN0ZW5lciwgTWVudUxpc3QsIEZvcm1Db250cm9sLCBUYWJsZUNvbnRhaW5lciwgd2l0aFN0eWxlcywgSW5wdXRBZG9ybm1lbnQsIElucHV0UHJvcHNcclxufSBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmVcIjtcclxuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7IHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCwgUHJvdmlkZXIgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjsgXHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5pbXBvcnQge3NhdmVEZXBvdH0gZnJvbSBcIi4vcmVuZGVyLWhhbmRsZXJzXCI7XHJcbmltcG9ydCB7IENsaWVudGUsIFByb2R1Y3RvLCBJdGVtLCBTdGF0ZSwgRGF0b3NQcmVzdXB1ZXN0bywgSWRDb25kSXZhLCBEYXRvc1BlZGlkbywgRGF0b3NEZXNkZSwgUHJlc3VwdWVzdG8sIFBlZGlkbywgSWRFc3RhZG9QcmVzdXB1ZXN0byB9IGZyb20gXCIuL3RpcG9zXCI7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSBcInJlZHV4XCI7XHJcbmltcG9ydCB7IEFjdGlvbnNGcm9tIH0gZnJvbSBcInJlZHV4LXR5cGVkLXJlZHVjZXJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBFU1RBRE9fQUNFUFRBRE9fUFJFU1VQVUVTVE86IElkRXN0YWRvUHJlc3VwdWVzdG8gPSBcImFjZXB0YWRvXCI7XHJcbnZhciBteT1teU93bjtcclxuXHJcbmV4cG9ydCB2YXIgZ2VuZXJhclBlZGlkb0Rlc2RlUHJlc3VwdWVzdG8gPSAoZGF0b3NQcmVzdXB1ZXN0bzpEYXRvc1ByZXN1cHVlc3RvKT0+e1xyXG4gICAgbGV0IHtjbGllbnRlLCBpdGVtcywgcHJlc3VwdWVzdG99ICA9IGRhdG9zUHJlc3VwdWVzdG87XHJcbiAgICBsZXQgZGF0b3NQZWRpZG86RGF0b3NQZWRpZG8gPSB7XHJcbiAgICAgICAgY2xpZW50ZSxcclxuICAgICAgICBpdGVtcyxcclxuICAgICAgICBwZWRpZG86e1xyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0bzogcHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgIGNsaWVudGU6IHByZXN1cHVlc3RvLmNsaWVudGUsXHJcbiAgICAgICAgICAgIGRlc2N1ZW50bzogcHJlc3VwdWVzdG8uZGVzY3VlbnRvLFxyXG4gICAgICAgICAgICBzdWJ0b3RhbDogcHJlc3VwdWVzdG8uc3VidG90YWwsXHJcbiAgICAgICAgICAgIHRvdGFsOiBwcmVzdXB1ZXN0by50b3RhbCxcclxuICAgICAgICAgICAgLi4uaW5pY2lhbGl6YXJQZWRpZG8oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkYXRvc1BlZGlkb1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5teS53U2NyZWVucy5wcmVzdXB1ZXN0bz1hc3luYyBmdW5jdGlvbihhZGRyUGFyYW1zKXtcclxuICAgIHZhciBkYXRvc1ByZXN1cHVlc3RvOiBEYXRvc1ByZXN1cHVlc3RvfG51bGw9bnVsbDtcclxuICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgIGlmKGFkZHJQYXJhbXMucHJlc3VwdWVzdG8pe1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgICAgICBkYXRvc1ByZXN1cHVlc3RvID0gYXdhaXQgbXkuYWpheC5wcmVzdXB1ZXN0b19jYXJnYXIoe3ByZXN1cHVlc3RvOmFkZHJQYXJhbXMucHJlc3VwdWVzdG99KTtcclxuICAgIH1cclxuICAgIHZhciBzdG9yZSA9IGF3YWl0IGNyZWFyU3RvcmUoe3VzZVNlc3Npb25TdG9yYWdlOnRydWUsIGRhdG9zUHJlc3VwdWVzdG86IGRhdG9zUHJlc3VwdWVzdG8gfHwgdW5kZWZpbmVkfSwgY3JlYXRlSW5pdGlhbFN0YXRlUHJlc3VwdWVzdG8pO1xyXG4gICAgZGVzcGxlZ2FyUHJlc3VwdWVzdG8oc3RvcmUpO1xyXG59XHJcblxyXG5teS53U2NyZWVucy5wZWRpZG89YXN5bmMgZnVuY3Rpb24oYWRkclBhcmFtcyl7XHJcbiAgICB2YXIgZGF0b3NQZWRpZG86IERhdG9zUGVkaWRvfG51bGw9bnVsbDtcclxuICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgIGlmKGFkZHJQYXJhbXMucGVkaWRvKXtcclxuICAgICAgICAvL0B0cy1pZ25vcmUgZXhpc3RlXHJcbiAgICAgICAgZGF0b3NQZWRpZG8gPSBhd2FpdCBteS5hamF4LnBlZGlkb19jYXJnYXIoe3BlZGlkbzphZGRyUGFyYW1zLnBlZGlkb30pO1xyXG4gICAgLy9AdHMtaWdub3JlIGV4aXN0ZVxyXG4gICAgfWVsc2UgaWYoYWRkclBhcmFtcy5wcmVzdXB1ZXN0byl7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlIGV4aXN0ZVxyXG4gICAgICAgIHZhciBkYXRvc1ByZXN1cHVlc3RvOiBEYXRvc1ByZXN1cHVlc3RvID0gYXdhaXQgbXkuYWpheC5wcmVzdXB1ZXN0b19jYXJnYXIoe3ByZXN1cHVlc3RvOmFkZHJQYXJhbXMucHJlc3VwdWVzdG99KTtcclxuICAgICAgICBkYXRvc1BlZGlkbyA9IGdlbmVyYXJQZWRpZG9EZXNkZVByZXN1cHVlc3RvKGRhdG9zUHJlc3VwdWVzdG8pO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0b3JlID0gYXdhaXQgY3JlYXJTdG9yZSh7dXNlU2Vzc2lvblN0b3JhZ2U6dHJ1ZSwgZGF0b3NQZWRpZG86IGRhdG9zUGVkaWRvIHx8IHVuZGVmaW5lZH0sIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbyk7XHJcbiAgICBkZXNwbGVnYXJQZWRpZG8oc3RvcmUpO1xyXG59XHJcblxyXG5cclxuXHJcbmNvbnN0IHVzZVN0eWxlcyA9IG1ha2VTdHlsZXMoKHRoZW1lKSA9PiAoe1xyXG4gICAgYXBwQmFyOiB7XHJcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxyXG4gICAgfSxcclxuICAgIGxheW91dDoge1xyXG4gICAgICB3aWR0aDogJ2F1dG8nLFxyXG4gICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBtYXJnaW5SaWdodDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgW3RoZW1lLmJyZWFrcG9pbnRzLnVwKDYwMCArIHRoZW1lLnNwYWNpbmcoMikgKiAyKV06IHtcclxuICAgICAgICAvL3dpZHRoOiA2MDAsXHJcbiAgICAgICAgLy9tYXJnaW5MZWZ0OiAnYXV0bycsXHJcbiAgICAgICAgLy9tYXJnaW5SaWdodDogJ2F1dG8nLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIHBhcGVyOiB7XHJcbiAgICAgIG1hcmdpblRvcDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgbWFyZ2luQm90dG9tOiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBwYWRkaW5nOiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBbdGhlbWUuYnJlYWtwb2ludHMudXAoNjAwICsgdGhlbWUuc3BhY2luZygzKSAqIDIpXToge1xyXG4gICAgICAgIG1hcmdpblRvcDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMiksXHJcbiAgICAgICAgcGFkZGluZzogdGhlbWUuc3BhY2luZygzKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBzdGVwcGVyOiB7XHJcbiAgICAgIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMywgMCwgNSksXHJcbiAgICB9LFxyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXHJcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1lbmQnLFxyXG4gICAgfSxcclxuICAgIGJ1dHRvbjoge1xyXG4gICAgICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcoMSksXHJcbiAgICAgIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZygxKSxcclxuICAgIH0sXHJcbiAgfSkpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEF1dG9jb21wbGV0ZXIocHJvcHM6e1xyXG4gICAgcm93czphbnlbXSwgXHJcbiAgICB2YWx1ZTphbnksXHJcbiAgICBzZWFyY2hLZXk6c3RyaW5nLCBcclxuICAgIHNlYXJjaFR5cGU6J3RleHQnfCdudW1iZXInLCBcclxuICAgIG9uU2VsZWN0aW9uOihyb3c6YW55KT0+dm9pZFxyXG4gICAgaWQ6IHN0cmluZyxcclxuICAgIGNsYXNzTmFtZT86c3RyaW5nLFxyXG4gICAgbGFiZWw/OiBzdHJpbmcsXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgZGlzYWJsZWQ/OmJvb2xlYW5cclxuICAgIG11bHRpbGluZT86Ym9vbGVhblxyXG4gICAgbWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFjaz86KGVsZW06UHJvZHVjdG8pPT5ib29sZWFuXHJcbn0pe1xyXG4gICAgY29uc3Qge3Jvd3MsIHZhbHVlLCBzZWFyY2hLZXksIHNlYXJjaFR5cGUsIG9uU2VsZWN0aW9uLCBpZCwgY2xhc3NOYW1lLCBsYWJlbCwgbmFtZSwgbWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFja30gPSBwcm9wcztcclxuICAgIGNvbnN0IGFuY2hvclJlZiA9IHVzZVJlZjxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ+KG51bGwpO1xyXG4gICAgY29uc3QgW2ZpbHRlcmVkUm93cywgc2V0RmlsdGVyZWRSb3dzXSA9IHVzZVN0YXRlPGFueVtdPihbXSk7XHJcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XHJcbiAgICBjb25zdCBbZm9jdXNPbkxpc3QsIHNldEZvY3VzT25MaXN0XSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIGNvbnN0IFt2YWxvckluZ3Jlc2Fkbywgc2V0VmFsb3JJbmdyZXNhZG9dID0gdXNlU3RhdGU8c3RyaW5nfG51bGw+KG51bGwpO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBzZXRWYWxvckluZ3Jlc2Fkbyh2YWx1ZSlcclxuICAgIH0sW3ZhbHVlXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9b3Blbj8naGlkZGVuJzondW5zZXQnXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZvY3VzVG9JZCA9IChpZDpzdHJpbmcsIG9wdHM6Rm9jdXNPcHRzLCBjYj86KGU6SFRNTEVsZW1lbnQpPT52b2lkKT0+e1xyXG4gICAgICAgIHZhciBlbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgICAgICB2YXIgcGFkcmU9ZWxlbWVudDtcclxuICAgICAgICB3aGlsZShwYWRyZSAmJiBwYWRyZS5jbGFzc05hbWUhPSdwcmVndW50YScgJiYgcGFkcmUhPWRvY3VtZW50LmJvZHkpIHBhZHJlID0gcGFkcmUucGFyZW50RWxlbWVudDtcclxuICAgICAgICBpZihwYWRyZSAmJiBwYWRyZS5jbGFzc05hbWU9PSdwcmVndW50YScpIGVsZW1lbnQ9cGFkcmU7XHJcbiAgICAgICAgaWYoZWxlbWVudCl7XHJcbiAgICAgICAgICAgIGlmKGNiKXtcclxuICAgICAgICAgICAgICAgIGNiKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGlmKG9wdHMubW92ZVRvRWxlbWVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwoe2JlaGF2aW9yOm9wdHMubW92ZUJlaGF2aW9yfHwnYXV0bycsIHRvcDp3aW5kb3cuc2Nyb2xsWS0xMDAsIGxlZnQ6MH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGVja0lmVmFsdWUgPSAoKSA9PiB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJvd3MuZmluZCgocm93KT0+cm93W3NlYXJjaEtleV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpPT0odmFsb3JJbmdyZXNhZG98fCcnKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZihyZXN1bHQpe1xyXG4gICAgICAgICAgICBzZXRWYWxvckluZ3Jlc2FkbyhyZXN1bHRbc2VhcmNoS2V5XSk7XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIHNldE9wZW4oZmFsc2UpICAgXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHNldFZhbG9ySW5ncmVzYWRvKG51bGwpO1xyXG4gICAgICAgICAgICBzZXRGaWx0ZXJlZFJvd3MoW10pO1xyXG4gICAgICAgICAgICBvblNlbGVjdGlvbihudWxsKTtcclxuICAgICAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQ8RXZlbnRUYXJnZXQ+KSA9PiB7XHJcbiAgICAgICAgaWYgKGFuY2hvclJlZi5jdXJyZW50ICYmIGFuY2hvclJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGVja0lmVmFsdWUoKTtcclxuICAgICAgICAvL3kgYWwgYm9ycmFyIGNvbiBiYWNrc3BhY2UgcHJpbWVybyBtYXJjYSBzaSBubyBlc3TDoSBtYXJjYWRvIHkgZGVzcHXDqXMgYm9ycmFcclxuICAgICAgICBmb2N1c1RvSWQoaWQsIHttb3ZlVG9FbGVtZW50OmZhbHNlfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVNlbGVjdGlvbiA9IChyb3c6YW55KT0+e1xyXG4gICAgICAgIG9uU2VsZWN0aW9uKHJvdyk7XHJcbiAgICAgICAgc2V0VmFsb3JJbmdyZXNhZG8ocm93W3NlYXJjaEtleV0pO1xyXG4gICAgICAgIHNldEZpbHRlcmVkUm93cyhbXSk7XHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgICAgZm9jdXNUb0lkKGlkLCB7bW92ZVRvRWxlbWVudDpmYWxzZX0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDw+XHJcbiAgICAgICAgPFRleHRGaWVsZFxyXG4gICAgICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxyXG4gICAgICAgICAgICBzcGVsbENoZWNrPXtmYWxzZX1cclxuICAgICAgICAgICAgYXV0b0NhcGl0YWxpemU9XCJvZmZcIlxyXG4gICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICBhdXRvQ29ycmVjdD1cIm9mZlwiXHJcbiAgICAgICAgICAgIG11bHRpbGluZT17cHJvcHMubXVsdGlsaW5lfVxyXG4gICAgICAgICAgICBuYW1lPXtuYW1lfVxyXG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgICAgICAgIHJlZj17YW5jaG9yUmVmfSBcclxuICAgICAgICAgICAgZnVsbFdpZHRoXHJcbiAgICAgICAgICAgIHR5cGU9e3NlYXJjaFR5cGV9XHJcbiAgICAgICAgICAgIGRpc2FibGVkPXtwcm9wcy5kaXNhYmxlZCB8fCBmYWxzZX1cclxuICAgICAgICAgICAgdmFsdWU9e3ZhbG9ySW5ncmVzYWRvIHx8ICcnfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgc2V0VmFsb3JJbmdyZXNhZG8oZXZlbnQudGFyZ2V0LnZhbHVlIHx8IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgc2V0RmlsdGVyZWRSb3dzKHJvd3MuZmlsdGVyKChyb3cpPT5cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zcGxpdCgnICcpLmV2ZXJ5KHBhbGFicmFCdXNjYWRhPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W3NlYXJjaEtleV0udG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhbGFicmFCdXNjYWRhLnRvTG9jYWxlTG93ZXJDYXNlKCkpICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoSW5MaXN0Q29uZGl0aW9uQ2FsbGJhY2s/bWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFjayhyb3cpOnRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgICBzZXRPcGVuKGV2ZW50LnRhcmdldC52YWx1ZS5sZW5ndGg+MSAmJiBmaWx0ZXJlZFJvd3MubGVuZ3RoIDw9IDEwKVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBvbkZvY3VzPXsoX2V2ZW50KT0+IHtcclxuICAgICAgICAgICAgICAgIHNldEZvY3VzT25MaXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vc2V0T3BlbighIXZhbG9ySW5ncmVzYWRvICYmIHZhbG9ySW5ncmVzYWRvLmxlbmd0aD4xKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgb25CbHVyPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYoIW9wZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSWZWYWx1ZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIG9uS2V5RG93bj17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgLy9kb3duIGtleVxyXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSA0MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYob3Blbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzT25MaXN0KHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9lbnRlciBrZXkgb3IgdGFiIGtleVxyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoWzEzLDldLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpKXtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0lmVmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBhcmlhLWNvbnRyb2xzPXtvcGVuID8gJ21lbnUtbGlzdC1ncm93JyA6IHVuZGVmaW5lZH1cclxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPFBvcHBlciBvcGVuPXtvcGVufSBhbmNob3JFbD17YW5jaG9yUmVmLmN1cnJlbnR9IHBsYWNlbWVudD1cImJvdHRvbS1zdGFydFwiIHRyYW5zaXRpb24+XHJcbiAgICAgICAgICB7KHsgVHJhbnNpdGlvblByb3BzLCBwbGFjZW1lbnQgfSkgPT4gKFxyXG4gICAgICAgICAgICA8R3Jvd1xyXG4gICAgICAgICAgICAgIHsuLi5UcmFuc2l0aW9uUHJvcHN9XHJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgdHJhbnNmb3JtT3JpZ2luOiBwbGFjZW1lbnQgPT09ICdib3R0b20nID8gJ2xlZnQgdG9wJyA6ICdjZW50ZXIgYm90dG9tJyB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFBhcGVyPlxyXG4gICAgICAgICAgICAgICAgPENsaWNrQXdheUxpc3RlbmVyIG9uQ2xpY2tBd2F5PXtoYW5kbGVDbG9zZX0+XHJcbiAgICAgICAgICAgICAgICAgIDxNZW51TGlzdCBhdXRvRm9jdXNJdGVtPXtmb2N1c09uTGlzdH0gIGlkPVwibWVudS1saXN0LWdyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSb3dzLmxlbmd0aD9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSb3dzLm1hcCgocm93LCBpKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17aX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCk9PmhhbmRsZVNlbGVjdGlvbihyb3cpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VzYyBrZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSAyNyAmJiBvcGVuKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wZW4oZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1RvSWQoaWQsIHttb3ZlVG9FbGVtZW50OmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90YWJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSA5KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbihyb3cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93W3NlYXJjaEtleV19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXstMX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTaW4gcmVzdWx0YWRvc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvTWVudUl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICA8L01lbnVMaXN0PlxyXG4gICAgICAgICAgICAgICAgPC9DbGlja0F3YXlMaXN0ZW5lcj5cclxuICAgICAgICAgICAgICA8L1BhcGVyPlxyXG4gICAgICAgICAgICA8L0dyb3c+XHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvUG9wcGVyPlxyXG4gICAgPC8+XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIFR5cGVkRmllbGQocHJvcHM6e1xyXG4gICAgdGV4dEFsaWduPzonbGVmdCd8J3JpZ2h0J3wnY2VudGVyJ3wnanVzdGlmeSd8J2luaGVyaXQnXHJcbiAgICB2YWx1ZTpzdHJpbmd8bnVtYmVyfG51bGwsXHJcbiAgICBkaXNhYmxlZD86Ym9vbGVhblxyXG4gICAgdHlwZTogJ3RleHQnfCdudW1iZXInfCdkYXRlJ3wndGltZSd8J3RlbCcsXHJcbiAgICBpZDpzdHJpbmcsXHJcbiAgICBjbGFzc05hbWU/OnN0cmluZyxcclxuICAgIG5hbWU/OnN0cmluZyxcclxuICAgIGxhYmVsPzpzdHJpbmdcclxuICAgIG9uQ2hhbmdlOih2YWx1ZTpzdHJpbmd8bnVtYmVyfG51bGwpPT52b2lkXHJcblxyXG4gICAgbWF0Y2hJbkxpc3Q/OmFueVtdLFxyXG4gICAgbXVsdGlsaW5lPzpib29sZWFuLFxyXG4gICAgaW5wdXRBZG9ybm1lbnQ/OnN0cmluZ1xyXG4gICAgYWRvcm5tZW50UG9zaXRpb24/OidzdGFydCd8J2VuZCdcclxufSl7XHJcbiAgICBjb25zdCB7dmFsdWUsIHR5cGUsIGlkLCBjbGFzc05hbWUsIG5hbWUsIGxhYmVsLCBvbkNoYW5nZSwgbWF0Y2hJbkxpc3QsIGRpc2FibGVkLCB0ZXh0QWxpZ24sIGlucHV0QWRvcm5tZW50LCBhZG9ybm1lbnRQb3NpdGlvbn0gPSBwcm9wcztcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgc2V0TXlWYWx1ZSh2YWx1ZSlcclxuICAgIH0sW3ZhbHVlXSk7XHJcbiAgICBjb25zdCBbbXlWYWx1ZSwgc2V0TXlWYWx1ZV0gPSB1c2VTdGF0ZSh2YWx1ZSk7XHJcbiAgICB2YXIgaW5wdXRQcm9wcz17XHJcbiAgICAgICBzdHlsZTogeyB0ZXh0QWxpZ246IHRleHRBbGlnbiB9XHJcbiAgICAgICBcclxuICAgIH1cclxuICAgIHZhciBpbnB1dExhYmVsUHJvcHM9e1xyXG4gICAgICBzaHJpbms6IHRydWUsXHJcbiAgICB9XHJcbiAgICB2YXIgYWRvcm5tZW50UHJvcHM6SW5wdXRQcm9wcyA9IHt9XHJcbiAgICB2YXIgYWRvcm5tZW50ID0gaW5wdXRBZG9ybm1lbnQ/PElucHV0QWRvcm5tZW50IHBvc2l0aW9uPVwiZW5kXCI+e2lucHV0QWRvcm5tZW50fTwvSW5wdXRBZG9ybm1lbnQ+Om51bGw7XHJcbiAgICBhZG9ybm1lbnRQb3NpdGlvbj09J3N0YXJ0Jz9cclxuICAgICAgICBhZG9ybm1lbnRQcm9wcy5zdGFydEFkb3JubWVudD1hZG9ybm1lbnRcclxuICAgIDpcclxuICAgICAgICBhZG9ybm1lbnRQcm9wcy5lbmRBZG9ybm1lbnQ9YWRvcm5tZW50XHJcbiAgICByZXR1cm4gPFRleHRGaWVsZFxyXG4gICAgICAgIGlucHV0UHJvcHM9e2lucHV0UHJvcHN9XHJcbiAgICAgICAgc3BlbGxDaGVjaz17ZmFsc2V9XHJcbiAgICAgICAgYXV0b0NhcGl0YWxpemU9XCJvZmZcIlxyXG4gICAgICAgIGF1dG9Db21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgYXV0b0NvcnJlY3Q9XCJvZmZcIlxyXG4gICAgICAgIHZhbHVlPXtteVZhbHVlPT1udWxsPycnOm15VmFsdWV9XHJcbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfHxmYWxzZX1cclxuICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgbXVsdGlsaW5lPXtwcm9wcy5tdWx0aWxpbmV9XHJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XHJcbiAgICAgICAgbmFtZT17bmFtZX1cclxuICAgICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgICAgdHlwZT17dHlwZX1cclxuICAgICAgICBmdWxsV2lkdGhcclxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgIHNldE15VmFsdWUodmFsdWU9PScnP251bGw6dmFsdWUpXHJcbiAgICAgICAgfX1cclxuICAgICAgICBvbkJsdXI9eygpPT57XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG1hdGNoSW5MaXN0P21hdGNoSW5MaXN0LmZpbmQoKGVsZW0pPT5lbGVtPT1teVZhbHVlKTpteVZhbHVlO1xyXG4gICAgICAgICAgICBzZXRNeVZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2UobXlWYWx1ZSlcclxuICAgICAgICB9fVxyXG4gICAgICAgIElucHV0TGFiZWxQcm9wcz17aW5wdXRMYWJlbFByb3BzfVxyXG4gICAgICAgIElucHV0UHJvcHM9e2Fkb3JubWVudFByb3BzfVxyXG4gICAgLz5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIENsaWVudGVDb21wb25lbnQocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW4sIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pe1xyXG4gICAgY29uc3Qge2RhdG9zRGVzZGV9ID0gcHJvcHM7XHJcbiAgICBjb25zdCB7Y2xpZW50ZXMsIGNvbmRpY2lvbmVzSXZhLCBjbGllbnRlQWN0dWFsfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe2NsaWVudGVzOmVzdGFkby5lc3RydWN0dXJhLmNsaWVudGVzLCBjb25kaWNpb25lc0l2YTplc3RhZG8uZXN0cnVjdHVyYS5jb25kaWNpb25lc0l2YSwgY2xpZW50ZUFjdHVhbDplc3RhZG9bZGF0b3NEZXNkZV0uY2xpZW50ZX0pKTtcclxuICAgIGNvbnN0IGNsaWVudGVzQXJyID0gbGlrZUFyKGNsaWVudGVzKS5hcnJheSgpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgY29uZGljaW9uZXNJdmFBcnIgPSBsaWtlQXIoY29uZGljaW9uZXNJdmEpLmFycmF5KCk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICByZXR1cm4gPFBhcGVyIGNsYXNzTmFtZT17Y2xhc3Nlcy5wYXBlcn0+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9ezN9PlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9IG1kPXsxfT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwuY2xpZW50ZX1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cImNsaWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjbGllbnRlXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkNsaWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoSW5MaXN0PXtjbGllbnRlc0Fyci5tYXAoKGNsaWVudGUpPT5jbGllbnRlLmNsaWVudGUpfVxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99IFxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hSZXN1bHQ9bnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0ID0gY2xpZW50ZXNBcnIuZmluZCgoY2xpZW50ZSk9PmNsaWVudGUuY2xpZW50ZT09dmFsdWUpIHx8IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0xJRU5URSh7Y2xpZW50ZTp7Li4uc2VhcmNoUmVzdWx0fSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17OH0gbWQ9ezV9PlxyXG4gICAgICAgICAgICAgICAgPEF1dG9jb21wbGV0ZXIgXHJcbiAgICAgICAgICAgICAgICAgICAgcm93cz17Y2xpZW50ZXNBcnJ9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwucmF6b25fc29jaWFsIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicmF6b24tc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwicmF6b24tc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlJhem9uIHNvY2lhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoS2V5PVwicmF6b25fc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hUeXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb30gXHJcbiAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Rpb249eyhjbGllbnRlU2VsZWNjaW9uYWRvOkNsaWVudGUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0xJRU5URSh7Y2xpZW50ZTp7Li4uY2xpZW50ZVNlbGVjY2lvbmFkb30sIGRhdG9zRGVzZGV9KSl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17Nn0gbWQ9ezN9PlxyXG4gICAgICAgICAgICAgICAgPEZvcm1Db250cm9sIGZ1bGxXaWR0aD5cclxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbCBpZD1cImNvbmRpY2lvbl9pdmFfbGFiZWxcIj5Db25kLiBJVkE8L0lucHV0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxJZD1cImNvbmRpY2lvbl9pdmFfbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbmRpY2lvbl9pdmFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2xpZW50ZUFjdHVhbC5jb25kaWNpb25faXZhIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpY2lvbl9pdmEgPSBldmVudC50YXJnZXQudmFsdWUgYXMgSWRDb25kSXZhfHxudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NMSUVOVEUoe2NsaWVudGU6ey4uLmNsaWVudGVBY3R1YWwsIGNvbmRpY2lvbl9pdmF9LCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29uZGljaW9uZXNJdmFBcnIubWFwKChjb25kaWNpb25JdmEpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e2NvbmRpY2lvbkl2YS5jb25kaWNpb259IHZhbHVlPXtjb25kaWNpb25JdmEuY29uZGljaW9ufT57Y29uZGljaW9uSXZhLm5vbWJyZX08L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9Gb3JtQ29udHJvbD5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezZ9IG1kPXszfT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwuY3VpdF9kbml9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJjdWl0X2RuaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDVUlUL0ROSVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImN1aXRfZG5pXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DTElFTlRFKHtjbGllbnRlOnsuLi5jbGllbnRlQWN0dWFsLCBjdWl0X2RuaTpOdW1iZXIodmFsdWUpfSwgZGF0b3NEZXNkZX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRXN0YWRvUHJlc3VwdWVzdG8ocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW59KXtcclxuICAgIGNvbnN0IHtwcmVzdXB1ZXN0bywgZXN0YWRvc1ByZXN1cHVlc3RvfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe3ByZXN1cHVlc3RvOiBlc3RhZG8uZGF0b3NQcmVzdXB1ZXN0by5wcmVzdXB1ZXN0bywgZXN0YWRvc1ByZXN1cHVlc3RvOiBlc3RhZG8uZXN0cnVjdHVyYS5lc3RhZG9zUHJlc3VwdWVzdG99KSk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICByZXR1cm4gPFBhcGVyIGNsYXNzTmFtZT17Y2xhc3Nlcy5wYXBlcn0+IFxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXszfT5cclxuICAgICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IHNtPXs0fT5cclxuICAgICAgICAgICAgICAgIDxGb3JtQ29udHJvbCBmdWxsV2lkdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPElucHV0TGFiZWwgaWQ9XCJlc3RhZG9fbGFiZWxcIj5Fc3RhZG88L0lucHV0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbElkPVwiZXN0YWRvX2xhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlc3RhZG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8uZXN0YWRvIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlc3RhZG8gPSBldmVudC50YXJnZXQudmFsdWUgYXMgc3RyaW5nfHxudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImVzdGFkb1wiLCB2YWxvcjplc3RhZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtlc3RhZG9zUHJlc3VwdWVzdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGVzdGFkbyk9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e2VzdGFkby5lc3RhZG99IHZhbHVlPXtlc3RhZG8uZXN0YWRvfT57ZXN0YWRvLm5vbWJyZX08L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L0Zvcm1Db250cm9sPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17NH0+XHJcbiAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8uZmVjaGF9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZlY2hhXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QUkVTVVBVRVNUTyh7Y2FtcG86XCJmZWNoYVwiLCB2YWxvcjp2YWx1ZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17NH0+XHJcbiAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8udmFsaWRvX2hhc3RhfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidmFsaWRvX2hhc3RhXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInZhbGlkbyBoYXN0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbGlkb19oYXN0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUFJFU1VQVUVTVE8oe2NhbXBvOlwidmFsaWRvX2hhc3RhXCIsIHZhbG9yOnZhbHVlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRXN0YWRvUGVkaWRvKHByb3BzOntlZGl0YW5kbzpib29sZWFufSl7XHJcbiAgICBjb25zdCB7cGVkaWRvLCBlc3RhZG9zUGVkaWRvfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe3BlZGlkbzogZXN0YWRvLmRhdG9zUGVkaWRvLnBlZGlkbywgZXN0YWRvc1BlZGlkbzogZXN0YWRvLmVzdHJ1Y3R1cmEuZXN0YWRvc1BlZGlkb30pKTtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSB1c2VTdHlsZXMoKTtcclxuICAgIHJldHVybiA8UGFwZXIgY2xhc3NOYW1lPXtjbGFzc2VzLnBhcGVyfT4gXHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9ezN9PlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9PlxyXG4gICAgICAgICAgICAgICAgPEZvcm1Db250cm9sIGZ1bGxXaWR0aD5cclxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbCBpZD1cImVzdGFkb19sYWJlbFwiPkVzdGFkbzwvSW5wdXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsSWQ9XCJlc3RhZG9fbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVzdGFkb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwZWRpZG8uZXN0YWRvIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVzdGFkbyA9IGV2ZW50LnRhcmdldC52YWx1ZSBhcyBzdHJpbmd8fG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUEVESURPKHtjYW1wbzpcImVzdGFkb1wiLCB2YWxvcjplc3RhZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtlc3RhZG9zUGVkaWRvLm1hcCgoZXN0YWRvKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0ga2V5PXtlc3RhZG8uZXN0YWRvfSB2YWx1ZT17ZXN0YWRvLmVzdGFkb30+e2VzdGFkby5ub21icmV9PC9NZW51SXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvRm9ybUNvbnRyb2w+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IHNtPXs0fT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwZWRpZG8uZmVjaGF9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZlY2hhXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwiZmVjaGFcIiwgdmFsb3I6dmFsdWV9KSlcclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9PlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3BlZGlkby5mZWNoYV9lbnRyZWdhfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZmVjaGFfZW50cmVnYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYSBlbnRyZWdhXCJcclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmVjaGFfZW50cmVnYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUEVESURPKHtjYW1wbzpcImZlY2hhX2VudHJlZ2FcIiwgdmFsb3I6dmFsdWV9KSlcclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgIDwvUGFwZXI+XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIE9ic2VydmFjaW9uZXNQZWRpZG8ocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW59KXtcclxuICAgIGNvbnN0IHtwZWRpZG99ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pih7cGVkaWRvOiBlc3RhZG8uZGF0b3NQZWRpZG8ucGVkaWRvfSkpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IHVzZVN0eWxlcygpO1xyXG4gICAgcmV0dXJuIDxQYXBlciBjbGFzc05hbWU9e2NsYXNzZXMucGFwZXJ9PiBcclxuICAgICAgICA8R3JpZCBjb250YWluZXIgc3BhY2luZz17M30+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17MTJ9PlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cGVkaWRvLm9ic2VydmFjaW9uZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJvYnNlcnZhY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIk9ic2VydmFjaW9uZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJvYnNlcnZhY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwib2JzZXJ2YWNpb25lc1wiLCB2YWxvcjp2YWx1ZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXRlbXMocHJvcHM6e1xyXG4gICAgZWRpdGFuZG86Ym9vbGVhbixcclxuICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM6Ym9vbGVhbixcclxuICAgIGNvbk9wY2lvbmVzOiBib29sZWFuLFxyXG4gICAgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlXHJcbiAgICBwcmVzdXB1ZXN0b09QZWRpZG86UHJlc3VwdWVzdG98UGVkaWRvXHJcbn0pe1xyXG4gICAgY29uc3Qge2NvbkRlc2N1ZW50b0VuSXRlbXMsIGNvbk9wY2lvbmVzLCBkYXRvc0Rlc2RlLCBwcmVzdXB1ZXN0b09QZWRpZG99ID0gcHJvcHM7XHJcbiAgICBjb25zdCB7aXRlbXMsIGNsaWVudGV9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9PmVzdGFkb1tkYXRvc0Rlc2RlXSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBoYW5kbGVBZGQgPSAoKT0+e1xyXG4gICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLkFERF9JVEVNKHtkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgc2V0VGltZW91dCgoKT0+Zm9jdXNUb0lkKFwiY2FudGlkYWRfXCIrKGl0ZW1zLmxlbmd0aC0xKS50b1N0cmluZygpLHttb3ZlVG9FbGVtZW50OmZhbHNlfSksMTAwKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDxUYWJsZUNvbnRhaW5lciBjb21wb25lbnQ9e1BhcGVyfT5cclxuICAgICAgICA8VGFibGUgYXJpYS1sYWJlbD1cImN1c3RvbWl6ZWQgdGFibGVcIiBpZD1cIml0ZW1zLXRhYmxlXCI+XHJcbiAgICAgICAgICAgIDxUYWJsZUhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBzdHlsZT17e3dpZHRoOlwiNTBweFwifX1jbGFzc05hbWU9XCJub3QtcHJpbnRcIj5JdGVtczwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjU1cHhcIn19PkNhbnRpZGFkPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBzdHlsZT17e3dpZHRoOlwiNjBweFwifX0+Q29kIHByb2Q8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPk5vbWJyZSBwcm9kPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbD5EZXNjcmlwY2lvbjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjgwcHhcIn19YWxpZ249XCJyaWdodFwiPlAgdW5pdGFyaW88L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIHN0eWxlPXt7d2lkdGg6XCI0MHB4XCJ9fWFsaWduPVwicmlnaHRcIj5EdG88L1N0eWxlZFRhYmxlQ2VsbD46bnVsbH1cclxuICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIHN0eWxlPXt7d2lkdGg6XCI1MHB4XCJ9fWFsaWduPVwicmlnaHRcIj5Cb25pZjwvU3R5bGVkVGFibGVDZWxsPjpudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjgwcHhcIn19YWxpZ249XCJyaWdodFwiPlRvdGFsPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxyXG4gICAgICAgICAgICA8L1RhYmxlSGVhZD5cclxuICAgICAgICAgICAgPFRhYmxlQm9keT5cclxuICAgICAgICAgICAgICAgIHtpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPEl0ZW1QIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT17aXRlbX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFuZG89e3Byb3BzLmVkaXRhbmRvfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ZT17Y2xpZW50ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uRGVzY3VlbnRvRW5JdGVtcz17Y29uRGVzY3VlbnRvRW5JdGVtc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b3NEZXNkZT17ZGF0b3NEZXNkZX1cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBjbGFzc05hbWU9XCJub3QtcHJpbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQWRkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb30gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbktleURvd249eyhldmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VudGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoWzEzXS5pbmNsdWRlcyhldmVudC5rZXlDb2RlKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFkZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ09OLkFkZC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAge2NvbkRlc2N1ZW50b0VuSXRlbXM/PFN0eWxlZFRhYmxlQ2VsbCBjb2xTcGFuPXsyfT48L1N0eWxlZFRhYmxlQ2VsbD46bnVsbH1cclxuICAgICAgICAgICAgICAgICAgICB7Y29uT3BjaW9uZXM/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY29sU3Bhbj17Mn0gYWxpZ249XCJyaWdodFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNvbFNwYW49ezR9IGFsaWduPVwicmlnaHRcIj5zdWJ0b3RhbCAkPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBzdHlsZT17dG90YWxzU3R5bGVzfT57cHJlc3VwdWVzdG9PUGVkaWRvLnN1YnRvdGFsfTwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxyXG4gICAgICAgICAgICAgICAge2Nvbk9wY2lvbmVzP251bGw6PD5cclxuICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25EZXNjdWVudG9Fbkl0ZW1zPzxTdHlsZWRUYWJsZUNlbGwgY29sU3Bhbj17Mn0+PC9TdHlsZWRUYWJsZUNlbGw+Om51bGx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgYWxpZ249XCJyaWdodFwiIGNvbFNwYW49ezR9PmRlc2N1ZW50byBnZW5lcmFsICQ8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG9PUGVkaWRvLmRlc2N1ZW50b31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImRlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9zRGVzZGU9PSdkYXRvc1ByZXN1cHVlc3RvJz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfREVTQ1VFTlRPX1BSRVNVUFVFU1RPKHtkZXNjdWVudG86TnVtYmVyKHZhbHVlKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9ERVNDVUVOVE9fUEVESURPKHtkZXNjdWVudG86TnVtYmVyKHZhbHVlKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlUm93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIGNvbFNwYW49ezN9PjwvU3R5bGVkVGFibGVDZWxsPjpudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBjb2xTcGFuPXtjb25EZXNjdWVudG9Fbkl0ZW1zPzM6NH0+dG90YWwgJDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBzdHlsZT17dG90YWxzU3R5bGVzfT57cHJlc3VwdWVzdG9PUGVkaWRvLnRvdGFsfTwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICA8Lz59XHJcbiAgICAgICAgICAgIDwvVGFibGVCb2R5PlxyXG4gICAgICAgIDwvVGFibGU+XHJcbiAgICA8L1RhYmxlQ29udGFpbmVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXRlbVAocHJvcHM6e2l0ZW06SXRlbSwgaW5kZXg6bnVtYmVyLCBlZGl0YW5kbzpib29sZWFuLCBjb25EZXNjdWVudG9Fbkl0ZW1zOmJvb2xlYW4sIGNsaWVudGU6IENsaWVudGUsIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pe1xyXG4gICAgY29uc3Qge3Byb2R1Y3Rvc30gPSB1c2VTZWxlY3RvcigoZXN0YWRvOlN0YXRlKT0+ZXN0YWRvLmVzdHJ1Y3R1cmEpO1xyXG4gICAgY29uc3QgcHJvZHVjdG9zQXJyID0gbGlrZUFyKHByb2R1Y3RvcykuYXJyYXkoKTtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IHtpdGVtLCBpbmRleCwgY29uRGVzY3VlbnRvRW5JdGVtcywgY2xpZW50ZSwgZGF0b3NEZXNkZX09cHJvcHM7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBFRElDSU9OX0xJQlJFID0gaXRlbS5wcm9kdWN0bz09MDtcclxuICAgIHJldHVybiA8R3JvdyBpbj17dHJ1ZX0+XHJcbiAgICAgICAgPFN0eWxlZFRhYmxlUm93IGtleT17aXRlbS5wcm9kdWN0b30+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9e1wiYWdyZWdhcl9cIiArIGluZGV4LnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlJFTU9WRV9JVEVNKHtpbmRleDogaW5kZXgsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uRGVsZXRlT3V0bGluZS8+XHJcbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgYWxpZ249XCJyaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICBpZD17XCJjYW50aWRhZF9cIiArIGluZGV4LnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0uY2FudGlkYWQgfHwgbnVsbH1cclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY2FudGlkYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FOVElEQURfSVRFTSh7aW5kZXgsY2FudGlkYWQ6TnVtYmVyKHZhbHVlKSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0ucHJvZHVjdG8gfHwgbnVsbH1cclxuICAgICAgICAgICAgICAgICAgICBpZD17XCJwb3JvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfVxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwcm9kdWN0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBtYXRjaEluTGlzdD17RURJQ0lPTl9MSUJSRT91bmRlZmluZWQ6cHJvZHVjdG9zQXJyLm1hcCgocHJvZHVjdG8pPT5wcm9kdWN0by5wcm9kdWN0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWU9PScwJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfRklFTERfQ1VTVE9NX0lURU0oe2luZGV4LCBjYW1wbzoncHJvZHVjdG8nLHZhbG9yOnZhbHVlLCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaFJlc3VsdD1udWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdCA9IHByb2R1Y3Rvc0Fyci5maW5kKChwcm9kdWN0byk9PnByb2R1Y3RvLnByb2R1Y3RvPT12YWx1ZSkgfHwgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX1BST0RVQ1RPX0lURU0oe2luZGV4LCBwcm9kdWN0bzpzZWFyY2hSZXN1bHQsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBjbGFzc05hbWU9XCJub3QtcHJpbnRcIj5cclxuICAgICAgICAgICAgICAgIDxBbHRvSW1wcmVzaW9uU3R5bGUgY2hhcnNQZXJMaW5lPXtjb25EZXNjdWVudG9Fbkl0ZW1zPzYwOjc1fSBjb21wb25lbnRJZD17XCJub21icmUtcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfSBsaW5lSGVpZ2h0PXszMH0gdmFsdWU9e2l0ZW0/Lm5vbWJyZSB8fCAnJ30vPlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRURJQ0lPTl9MSUJSRT9UeXBlZEZpZWxkOkF1dG9jb21wbGV0ZXIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ue1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6aXRlbT8ubm9tYnJlIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6XCJub21icmUtcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcIm5vbWJyZS1wcm9kdWN0b1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IXByb3BzLmVkaXRhbmRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlsaW5lOnRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEluTGlzdENvbmRpdGlvbkNhbGxiYWNrOihwcm9kdWN0bzogUHJvZHVjdG8pPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRlLmNsaWVudGUgPT0gcHJvZHVjdG8uY2xpZW50ZSB8fCBwcm9kdWN0by5jbGllbnRlID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LC4uLihFRElDSU9OX0xJQlJFP3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOih2YWx1ZTogc3RyaW5nKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0ZJRUxEX0NVU1RPTV9JVEVNKHtpbmRleCwgY2FtcG86J25vbWJyZScsdmFsb3I6dmFsdWUsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzOiBwcm9kdWN0b3NBcnIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hLZXk6XCJub21icmVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFR5cGU6XCJ0ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZHVjdG9TZWxlY2Npb25hZG86UHJvZHVjdG98bnVsbCk9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfUFJPRFVDVE9fSVRFTSh7aW5kZXgsIHByb2R1Y3RvOnByb2R1Y3RvU2VsZWNjaW9uYWRvLCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICA8QWx0b0ltcHJlc2lvblN0eWxlIGNoYXJzUGVyTGluZT17Y29uRGVzY3VlbnRvRW5JdGVtcz82MDo3NX0gY29tcG9uZW50SWQ9e1wiZGVzY3JpcGNpb24tcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfSBsaW5lSGVpZ2h0PXszMH0gdmFsdWU9e2l0ZW0/LmRlc2NyaXBjaW9uIHx8ICcnfS8+XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChFRElDSU9OX0xJQlJFP1R5cGVkRmllbGQ6QXV0b2NvbXBsZXRlciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTppdGVtPy5kZXNjcmlwY2lvbiB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOlwiZGVzY3JpcGNpb24tcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcImRlc2NyaXBjaW9uLXByb2R1Y3RvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDohcHJvcHMuZWRpdGFuZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmU6dHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwuLi4oRURJQ0lPTl9MSUJSRT97XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZToodmFsdWU6c3RyaW5nKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0ZJRUxEX0NVU1RPTV9JVEVNKHtpbmRleCwgY2FtcG86J2Rlc2NyaXBjaW9uJyx2YWxvcjp2YWx1ZSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9OntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M6IHByb2R1Y3Rvc0FycixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEtleTpcImRlc2NyaXBjaW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUeXBlOlwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2R1Y3RvU2VsZWNjaW9uYWRvOlByb2R1Y3RvfG51bGwpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX1BST0RVQ1RPX0lURU0oe2luZGV4LCBwcm9kdWN0bzpwcm9kdWN0b1NlbGVjY2lvbmFkbywgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj57XHJcbiAgICAgICAgICAgICAgICBFRElDSU9OX0xJQlJFP1xyXG4gICAgICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e1wicHJlY2lvX3VuaXRhcmlvXCIgKyBpbmRleC50b1N0cmluZygpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0ucHJlY2lvX3VuaXRhcmlvIHx8IG51bGx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwcmVjaW9fdW5pdGFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfRklFTERfQ1VTVE9NX0lURU0oe2luZGV4LCBjYW1wbzoncHJlY2lvX3VuaXRhcmlvJyx2YWxvcjp2YWx1ZSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnByZWNpb191bml0YXJpbz8udG9TdHJpbmcoKX1cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIHtjb25EZXNjdWVudG9Fbkl0ZW1zP1xyXG4gICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtpdGVtLnBvcmNlbnRhamVfZGVzY3VlbnRvfHwgMH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPXtcInBvcmNlbnRhamVfZGVzY3VlbnRvX1wiICsgaW5kZXgudG9TdHJpbmcoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwb3JjZW50YWplX2Rlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9ERVNDVUVOVE9fSVRFTSh7aW5kZXgsIHBvcmNlbnRhamU6TnVtYmVyKHZhbHVlKSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QWRvcm5tZW50PVwiJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpdGVtLmRlc2N1ZW50b31cclxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICA6bnVsbH1cclxuICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCIgc3R5bGU9e3RvdGFsc1N0eWxlc30+e2l0ZW0udG90YWw/LnRvU3RyaW5nKCl9PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgPC9TdHlsZWRUYWJsZVJvdz5cclxuICAgIDwvR3Jvdz5cclxufVxyXG5cclxuY29uc3QgU3R5bGVkVGFibGVDZWxsID0gd2l0aFN0eWxlcygodGhlbWU6IFRoZW1lKSA9PlxyXG4gIGNyZWF0ZVN0eWxlcyh7XHJcbiAgICBoZWFkOiB7XHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5jb21tb24uYmxhY2ssXHJcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmNvbW1vbi53aGl0ZSxcclxuICAgIH0sXHJcbiAgICBib2R5OiB7XHJcbiAgICAgIGZvbnRTaXplOiAxNCxcclxuICAgICAgcGFkZGluZzogOFxyXG4gICAgfSxcclxuICB9KSxcclxuKShUYWJsZUNlbGwpO1xyXG5cclxuY29uc3QgU3R5bGVkVGFibGVSb3cgPSB3aXRoU3R5bGVzKCh0aGVtZTogVGhlbWUpID0+XHJcbiAgY3JlYXRlU3R5bGVzKHtcclxuICAgIHJvb3Q6IHtcclxuICAgICAgJyY6bnRoLW9mLXR5cGUob2RkKSc6IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmhvdmVyLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICB9KSxcclxuKShUYWJsZVJvdyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUHJlc3VwdWVzdG9Db21wb25lbnQoX3Byb3BzOnt9KXtcclxuICAgIGNvbnN0IHtjbGllbnRlLCBwcmVzdXB1ZXN0bywgaXRlbXN9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pihlc3RhZG8uZGF0b3NQcmVzdXB1ZXN0bykpO1xyXG4gICAgY29uc3Qge2VzdGFkb3NQcmVzdXB1ZXN0b30gPSB1c2VTZWxlY3RvcigoZXN0YWRvOlN0YXRlKT0+KHtlc3RhZG9zUHJlc3VwdWVzdG86ZXN0YWRvLmVzdHJ1Y3R1cmEuZXN0YWRvc1ByZXN1cHVlc3RvfSkpO1xyXG4gICAgY29uc3Qge3BhcmFtZXRyb3N9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pihlc3RhZG8uZXN0cnVjdHVyYSkpO1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IHVzZVN0eWxlcygpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgZXNOdWV2byA9ICEocHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8pO1xyXG4gICAgY29uc3QgZGlzYWJsZWQgPSAhZXN0YWRvc1ByZXN1cHVlc3RvLmZpbmQoKGVzdGFkbyk9PmVzdGFkby5lc3RhZG8gPT0gcHJlc3VwdWVzdG8uZXN0YWRvKT8ucGVybWl0ZV9lZGl0YXI7XHJcbiAgICBjb25zdCBbZWRpdGFuZG8sIHNldEVkaXRhbmRvXSA9IHVzZVN0YXRlKGVzTnVldm8pO1xyXG4gICAgY29uc3QgW3NuYWNrQmFyTWVzc2FnZSwgc2V0U25hY2tCYXJNZXNzYWdlXSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IGhheURlc2N1ZW50b3NJbmdyZXNhZG9zID0gaXRlbXMuc29tZSgoaXRlbSk9Pml0ZW0uZGVzY3VlbnRvICE9IDApO1xyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoX2V2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCB8IFJlYWN0Lk1vdXNlRXZlbnQsIHJlYXNvbj86IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChyZWFzb24gPT09ICdjbGlja2F3YXknKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICByZXR1cm4gPG1haW4gY2xhc3NOYW1lPXtjbGFzc2VzLmxheW91dH0gaWQ9XCJwcmVzdXB1ZXN0b1wiPlxyXG4gICAgICAgIDxpbWcgaWQ9XCJiYW5uZXItc3VwZXJpb3ItaW1wcmVzaW9uXCIgY2xhc3NOYW1lPVwib25seS1mb3ItcHJpbnRcIiBzcmM9XCJpbWcvYmFubmVyc3VwZXJpb3IucG5nXCIgYWx0PVwiYmFubmVyc3VwZXJpb3IucG5nXCIvPlxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBhbGlnbkl0ZW1zPVwiZmxleC1zdGFydFwiIGp1c3RpZnk9XCJmbGV4LXN0YXJ0XCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxoMj57cHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8/YFByZXN1cHVlc3RvIE7CuiAke3ByZXN1cHVlc3RvLnByZXN1cHVlc3RvfWA6YE51ZXZvIHByZXN1cHVlc3RvYH08L2gyPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1lbmRcIiBkaXJlY3Rpb249XCJyb3dcIj5cclxuICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj17ZWRpdGFuZG8/XCJzZWNvbmRhcnlcIjpcInByaW1hcnlcIn1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGFuZG8oIWVkaXRhbmRvKVxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHtlZGl0YW5kbz9cclxuICAgICAgICAgICAgICAgICAgICA8SUNPTi5DYW5jZWwvPlxyXG4gICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgIDxJQ09OLkVkaXQvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wcmludCgpXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPElDT04uUHJpbnQvPlxyXG4gICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPENsaWVudGVDb21wb25lbnQgZWRpdGFuZG89e2VkaXRhbmRvfSBkYXRvc0Rlc2RlPVwiZGF0b3NQcmVzdXB1ZXN0b1wiLz5cclxuICAgICAgICA8RXN0YWRvUHJlc3VwdWVzdG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEl0ZW1zIFxyXG4gICAgICAgICAgICBlZGl0YW5kbz17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM9e3ByZXN1cHVlc3RvLmNvbl9kZXNjdWVudG9fZW5faXRlbXN9XHJcbiAgICAgICAgICAgIGNvbk9wY2lvbmVzPXtwcmVzdXB1ZXN0by5jb25fb3BjaW9uZXN9XHJcbiAgICAgICAgICAgIGRhdG9zRGVzZGU9J2RhdG9zUHJlc3VwdWVzdG8nXHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvT1BlZGlkbz17cHJlc3VwdWVzdG99XHJcbiAgICAgICAgLz5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgY2xhc3NOYW1lPVwibm90LXByaW50XCIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1lbmRcIiBkaXJlY3Rpb249XCJyb3dcIj5cclxuICAgICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2w9e1xyXG4gICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtwcmVzdXB1ZXN0by5jb25fb3BjaW9uZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImNvbl9vcGNpb25lc1wiLCB2YWxvcjpldmVudC50YXJnZXQuY2hlY2tlZH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29uX29wY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJzdGFydFwiXHJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIm9jdWx0YXIgdG90YWxlc1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBjbGFzc05hbWU9XCJub3QtcHJpbnRcIiBhbGlnbkl0ZW1zPVwiZmxleC1zdGFydFwiIGp1c3RpZnk9XCJmbGV4LWVuZFwiIGRpcmVjdGlvbj1cInJvd1wiPlxyXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxyXG4gICAgICAgICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3ByZXN1cHVlc3RvLmNvbl9kZXNjdWVudG9fZW5faXRlbXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImNvbl9kZXNjdWVudG9fZW5faXRlbXNcIiwgdmFsb3I6ZXZlbnQudGFyZ2V0LmNoZWNrZWR9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFlZGl0YW5kbyB8fCBoYXlEZXNjdWVudG9zSW5ncmVzYWRvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImNvbl9kZXNjdWVudG9fZW5faXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsYWJlbFBsYWNlbWVudD1cInN0YXJ0XCJcclxuICAgICAgICAgICAgICAgIGxhYmVsPVwiZGVzY3VlbnRvIGVuIGl0ZW1zXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGd1YXJkYXJQcmVzdXB1ZXN0byhjbGllbnRlLCBwcmVzdXB1ZXN0bywgaXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUFJFU1VQVUVTVE8oe2NhbXBvOlwicHJlc3VwdWVzdG9cIiwgdmFsb3I6cmVzdWx0LnByZXN1cHVlc3RvfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNuYWNrQmFyTWVzc2FnZShgUHJlc3VwdWVzdG8gJHtyZXN1bHQucHJlc3VwdWVzdG99IGd1YXJkYWRvYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGFuZG8oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTbmFja0Jhck1lc3NhZ2UoYEVycm9yIGFsIGd1YXJkYXIgZWwgcHJlc3VwdWVzdG8uICR7ZXJyLm1lc3NhZ2V9YClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPElDT04uU2F2ZS8+XHJcbiAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICA8U25hY2tiYXJcclxuICAgICAgICAgICAgICAgIGFuY2hvck9yaWdpbj17e1xyXG4gICAgICAgICAgICAgICAgdmVydGljYWw6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbDogJ2xlZnQnLFxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIG9wZW49e29wZW59XHJcbiAgICAgICAgICAgICAgICBhdXRvSGlkZUR1cmF0aW9uPXs2MDAwfVxyXG4gICAgICAgICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlPXtzbmFja0Jhck1lc3NhZ2V9XHJcbiAgICAgICAgICAgICAgICBhY3Rpb249e1xyXG4gICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b24gc2l6ZT1cInNtYWxsXCIgYXJpYS1sYWJlbD1cImNsb3NlXCIgY29sb3I9XCJpbmhlcml0XCIgb25DbGljaz17aGFuZGxlQ2xvc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDT04uQ2xvc2UvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAge3BhcmFtZXRyb3M/LmxlZ2FsZXNfcHJlc3VwdWVzdG8/XHJcbiAgICAgICAgICAgIDxQYXBlciBjbGFzc05hbWU9e2NsYXNzZXMucGFwZXIrXCIgbGVnYWxlc1wifT4gXHJcbiAgICAgICAgICAgICAgICA8cD57cGFyYW1ldHJvcy5sZWdhbGVzX3ByZXN1cHVlc3RvfTwvcD5cclxuICAgICAgICAgICAgPC9QYXBlcj5cclxuICAgICAgICA6XHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICB9XHJcbiAgICA8L21haW4+XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBQZWRpZG9Db21wb25lbnQoX3Byb3BzOnt9KXtcclxuICAgIGNvbnN0IHtjbGllbnRlLCBwZWRpZG8sIGl0ZW1zfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oZXN0YWRvLmRhdG9zUGVkaWRvKSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgICBjb25zdCBlc051ZXZvID0gIShwZWRpZG8ucGVkaWRvKTtcclxuICAgIGNvbnN0IFtlZGl0YW5kbywgc2V0RWRpdGFuZG9dID0gdXNlU3RhdGUoZXNOdWV2byk7XHJcbiAgICBjb25zdCBbc25hY2tCYXJNZXNzYWdlLCBzZXRTbmFja0Jhck1lc3NhZ2VdID0gdXNlU3RhdGUoJycpO1xyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoX2V2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCB8IFJlYWN0Lk1vdXNlRXZlbnQsIHJlYXNvbj86IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChyZWFzb24gPT09ICdjbGlja2F3YXknKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICByZXR1cm4gPG1haW4gY2xhc3NOYW1lPXtjbGFzc2VzLmxheW91dH0gaWQ9XCJwZWRpZG9cIj5cclxuICAgICAgICA8aW1nIGlkPVwiYmFubmVyLXN1cGVyaW9yLWltcHJlc2lvblwiIGNsYXNzTmFtZT1cIm9ubHktZm9yLXByaW50XCIgc3JjPVwiaW1nL2Jhbm5lcnN1cGVyaW9yLnBuZ1wiIGFsdD1cImJhbm5lcnN1cGVyaW9yLnBuZ1wiLz5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1zdGFydFwiIGRpcmVjdGlvbj1cInJvd1wiPlxyXG4gICAgICAgICAgICA8aDI+e3BlZGlkby5wZWRpZG8/YFBlZGlkbyBOwrogJHtwZWRpZG8ucGVkaWRvfWA6YE51ZXZvIHBlZGlkb2B9PC9oMj5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9e2VkaXRhbmRvP1wic2Vjb25kYXJ5XCI6XCJwcmltYXJ5XCJ9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEVkaXRhbmRvKCFlZGl0YW5kbylcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuYnV0dG9ufVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7ZWRpdGFuZG8/XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uQ2FuY2VsLz5cclxuICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICA8SUNPTi5FZGl0Lz5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2VkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucHJpbnQoKVxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxJQ09OLlByaW50Lz5cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDxDbGllbnRlQ29tcG9uZW50IGVkaXRhbmRvPXtlZGl0YW5kb30gZGF0b3NEZXNkZT1cImRhdG9zUGVkaWRvXCIvPlxyXG4gICAgICAgIDxFc3RhZG9QZWRpZG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEl0ZW1zIFxyXG4gICAgICAgICAgICBlZGl0YW5kbz17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM9e3RydWV9XHJcbiAgICAgICAgICAgIGNvbk9wY2lvbmVzPXtmYWxzZX1cclxuICAgICAgICAgICAgZGF0b3NEZXNkZT0nZGF0b3NQZWRpZG8nXHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvT1BlZGlkbz17cGVkaWRvfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPE9ic2VydmFjaW9uZXNQZWRpZG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGd1YXJkYXJQZWRpZG8oY2xpZW50ZSwgcGVkaWRvLCBpdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwicGVkaWRvXCIsIHZhbG9yOnJlc3VsdC5wZWRpZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U25hY2tCYXJNZXNzYWdlKGBQZWRpZG8gJHtyZXN1bHQucGVkaWRvfSBndWFyZGFkb2ApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wZW4odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRhbmRvKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U25hY2tCYXJNZXNzYWdlKGBFcnJvciBhbCBndWFyZGFyIGVsIHBlZGlkby4gJHtlcnIubWVzc2FnZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRPcGVuKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuYnV0dG9ufVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8SUNPTi5TYXZlLz5cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxTbmFja2JhclxyXG4gICAgICAgICAgICAgICAgYW5jaG9yT3JpZ2luPXt7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbDogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgb3Blbj17b3Blbn1cclxuICAgICAgICAgICAgICAgIGF1dG9IaWRlRHVyYXRpb249ezYwMDB9XHJcbiAgICAgICAgICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3NuYWNrQmFyTWVzc2FnZX1cclxuICAgICAgICAgICAgICAgIGFjdGlvbj17XHJcbiAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvbiBzaXplPVwic21hbGxcIiBhcmlhLWxhYmVsPVwiY2xvc2VcIiBjb2xvcj1cImluaGVyaXRcIiBvbkNsaWNrPXtoYW5kbGVDbG9zZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNPTi5DbG9zZS8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgIDwvbWFpbj5cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3BsZWdhclByZXN1cHVlc3RvKHN0b3JlOlN0b3JlPFN0YXRlLEFjdGlvbkZvcm11bGFyaW9TdGF0ZT4pe1xyXG4gICAgUmVhY3RET00ucmVuZGVyKFxyXG4gICAgICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxyXG4gICAgICAgICAgICA8UHJlc3VwdWVzdG9Db21wb25lbnQvPlxyXG4gICAgICAgIDwvUHJvdmlkZXI+XHJcbiAgICAgICAgLFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluX2xheW91dCcpXHJcbiAgICApXHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNwbGVnYXJQZWRpZG8oc3RvcmU6U3RvcmU8U3RhdGUsQWN0aW9uRm9ybXVsYXJpb1N0YXRlPil7XHJcbiAgICBSZWFjdERPTS5yZW5kZXIoXHJcbiAgICAgICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZX0+XHJcbiAgICAgICAgICAgIDxQZWRpZG9Db21wb25lbnQvPlxyXG4gICAgICAgIDwvUHJvdmlkZXI+XHJcbiAgICAgICAgLFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluX2xheW91dCcpXHJcbiAgICApXHJcbn1cclxuXHJcbmlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKXtcclxuICAgIC8vIEB0cy1pZ25vcmUgcGFyYSBoYWNlcmxvXHJcbiAgICB3aW5kb3cuZGVzcGxlZ2FyUHJlc3VwdWVzdG8gPSBkZXNwbGVnYXJQcmVzdXB1ZXN0bztcclxuICAgIC8vIEB0cy1pZ25vcmUgcGFyYSBoYWNlcmxvXHJcbiAgICB3aW5kb3cuZGVzcGxlZ2FyUGVkaWRvID0gZGVzcGxlZ2FyUGVkaWRvO1xyXG59Il19
|