mapa-library-ui 0.25.3 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/esm2020/lib/core/js-brasil/index.mjs +16 -0
  2. package/esm2020/lib/core/js-brasil/src/create.mjs +455 -0
  3. package/esm2020/lib/core/js-brasil/src/createNumberMask.mjs +115 -0
  4. package/esm2020/lib/core/js-brasil/src/estados.mjs +34 -0
  5. package/esm2020/lib/core/js-brasil/src/index.mjs +34 -0
  6. package/esm2020/lib/core/js-brasil/src/inscricaoestadual.mjs +702 -0
  7. package/esm2020/lib/core/js-brasil/src/interfaces.mjs +2 -0
  8. package/esm2020/lib/core/js-brasil/src/iptu.mjs +25 -0
  9. package/esm2020/lib/core/js-brasil/src/iptu_create.mjs +60 -0
  10. package/esm2020/lib/core/js-brasil/src/iptu_mask.mjs +38 -0
  11. package/esm2020/lib/core/js-brasil/src/iptu_validate.mjs +67 -0
  12. package/esm2020/lib/core/js-brasil/src/mask.mjs +579 -0
  13. package/esm2020/lib/core/js-brasil/src/name.mjs +371 -0
  14. package/esm2020/lib/core/js-brasil/src/placa.mjs +162 -0
  15. package/esm2020/lib/core/js-brasil/src/rg.mjs +63 -0
  16. package/esm2020/lib/core/js-brasil/src/saude.mjs +62 -0
  17. package/esm2020/lib/core/js-brasil/src/utils.mjs +304 -0
  18. package/esm2020/lib/core/js-brasil/src/validate.mjs +627 -0
  19. package/esm2020/lib/core/pipes/cpf.mjs +17 -0
  20. package/esm2020/public-api.mjs +3 -1
  21. package/esm2020/src/lib/components/table/lib/components/table/public-api.mjs +2 -1
  22. package/esm2020/src/lib/components/table/lib/components/table/src/table.module.mjs +10 -3
  23. package/fesm2015/mapa-library-ui-src-lib-components-table.mjs +31 -24
  24. package/fesm2015/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
  25. package/fesm2015/mapa-library-ui.mjs +3675 -2
  26. package/fesm2015/mapa-library-ui.mjs.map +1 -1
  27. package/fesm2020/mapa-library-ui-src-lib-components-table.mjs +31 -24
  28. package/fesm2020/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
  29. package/fesm2020/mapa-library-ui.mjs +3682 -2
  30. package/fesm2020/mapa-library-ui.mjs.map +1 -1
  31. package/lib/core/js-brasil/index.d.ts +15 -0
  32. package/lib/core/js-brasil/src/create.d.ts +37 -0
  33. package/lib/core/js-brasil/src/createNumberMask.d.ts +13 -0
  34. package/lib/core/js-brasil/src/estados.d.ts +7 -0
  35. package/lib/core/js-brasil/src/index.d.ts +34 -0
  36. package/lib/core/js-brasil/src/inscricaoestadual.d.ts +7 -0
  37. package/lib/core/js-brasil/src/interfaces.d.ts +51 -0
  38. package/lib/core/js-brasil/src/iptu.d.ts +3 -0
  39. package/lib/core/js-brasil/src/iptu_create.d.ts +5 -0
  40. package/lib/core/js-brasil/src/iptu_mask.d.ts +2 -0
  41. package/lib/core/js-brasil/src/iptu_validate.d.ts +10 -0
  42. package/lib/core/js-brasil/src/mask.d.ts +53 -0
  43. package/lib/core/js-brasil/src/name.d.ts +9 -0
  44. package/lib/core/js-brasil/src/placa.d.ts +6 -0
  45. package/lib/core/js-brasil/src/rg.d.ts +5 -0
  46. package/lib/core/js-brasil/src/saude.d.ts +84 -0
  47. package/lib/core/js-brasil/src/utils.d.ts +71 -0
  48. package/lib/core/js-brasil/src/validate.d.ts +90 -0
  49. package/lib/core/pipes/cpf.d.ts +7 -0
  50. package/mapa-library-ui-0.26.0.tgz +0 -0
  51. package/package.json +1 -1
  52. package/public-api.d.ts +2 -0
  53. package/src/lib/components/table/lib/components/table/public-api.d.ts +1 -0
  54. package/mapa-library-ui-0.25.3.tgz +0 -0
@@ -0,0 +1,627 @@
1
+ import { getAllDigits, fillString, getAllWords } from './utils';
2
+ import { validate_inscricaoestadual } from './inscricaoestadual';
3
+ import { validate_placa } from './placa';
4
+ import { create_cnpj, create_cpf, create_renavam, create_ect, create_processo, create_titulo_atual, create_cnh, create_certidao, create_aih, create_pispasep, create_cnhespelho, create_renachestadual, create_renachseguranca } from './create';
5
+ import RG from './rg';
6
+ import { validate_iptu } from './iptu';
7
+ import { ESTADOS_SIGLA } from './estados';
8
+ export function validate_aih(aih) {
9
+ const aihClean = aih.replace(/[^\d]+/g, '');
10
+ const dvOriginal = aihClean.substr(-1);
11
+ const dv = create_aih(aihClean);
12
+ return dvOriginal === dv;
13
+ }
14
+ export function validate_celular(cel) {
15
+ let celClean = cel.replace(/[^\d]+/g, '');
16
+ celClean = celClean.replace(/_/g, '');
17
+ if (celClean.length !== 11) {
18
+ return false;
19
+ }
20
+ if (celClean[0] == 0 || celClean[2] < 5) {
21
+ return false;
22
+ }
23
+ return true;
24
+ }
25
+ export const CEPRange = {
26
+ 'SP': /^([1][0-9]{3}|[01][0-9]{4})[0-9]{3}$/g,
27
+ 'RJ': /^[2][0-8][0-9]{3}[0-9]{3}$/g,
28
+ 'MS': /^[7][9][0-9]{3}[0-9]{3}$/g,
29
+ 'MG': /^[3][0-9]{4}[0-9]{3}$/g,
30
+ 'MT': /^[7][8][8][0-9]{2}[0-9]{3}$/g,
31
+ 'AC': /^[6][9]{2}[0-9]{2}[0-9]{3}$/g,
32
+ 'AL': /^[5][7][0-9]{3}[0-9]{3}$/g,
33
+ 'AM': /^[6][9][0-8][0-9]{2}[0-9]{3}$/g,
34
+ 'AP': /^[6][89][9][0-9]{2}[0-9]{3}$/g,
35
+ 'BA': /^[4][0-8][0-9]{3}[0-9]{3}$/g,
36
+ 'CE': /^[6][0-3][0-9]{3}[0-9]{3}$/g,
37
+ 'DF': /^[7][0-3][0-6][0-9]{2}[0-9]{3}$/g,
38
+ 'ES': /^[2][9][0-9]{3}[0-9]{3}$/g,
39
+ 'GO': /^[7][3-6][7-9][0-9]{2}[0-9]{3}$/g,
40
+ 'MA': /^[6][5][0-9]{3}[0-9]{3}$/g,
41
+ 'PA': /^[6][6-8][0-8][0-9]{2}[0-9]{3}$/g,
42
+ 'PB': /^[5][8][0-9]{3}[0-9]{3}$/g,
43
+ 'PE': /^[5][0-6][0-9]{2}[0-9]{3}$/g,
44
+ 'PI': /^[6][4][0-9]{3}[0-9]{3}$/g,
45
+ 'PR': /^[8][0-7][0-9]{3}[0-9]{3}$/g,
46
+ 'RN': /^[5][9][0-9]{3}[0-9]{3}$/g,
47
+ 'RO': /^[7][8][9][0-9]{2}[0-9]{3}$/g,
48
+ 'RR': /^[6][9][3][0-9]{2}[0-9]{3}$/g,
49
+ 'RS': /^[9][0-9]{4}[0-9]{3}$/g,
50
+ 'SC': /^[8][89][0-9]{3}[0-9]{3}$/g,
51
+ 'SE': /^[4][9][0-9]{3}[0-9]{3}$/g,
52
+ 'TO': /^[7][7][0-9]{3}[0-9]{3}$/g,
53
+ };
54
+ export function validate_cep(cep) {
55
+ const cepClean = cep.replace(/[^\d]+/g, '');
56
+ const exp = /\d{2}\.\d{3}\-\d{3}/;
57
+ if (!exp.test(cep) && cepClean.length !== 8) {
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ export function cep_ranges(cep) {
63
+ cep = (cep.toString()).replace(/[^\d]+/g, '');
64
+ cep = parseInt(cep, 10);
65
+ const cepString = cep.toString();
66
+ let found;
67
+ for (let estado in CEPRange) {
68
+ const v = CEPRange[estado];
69
+ const r = new RegExp(v).test(cepString);
70
+ if (r) {
71
+ found = r;
72
+ return true;
73
+ }
74
+ }
75
+ if (!found) {
76
+ return false;
77
+ }
78
+ return true;
79
+ }
80
+ export function validate_certidao(value) {
81
+ let certidao = getAllDigits(value);
82
+ const format = /[0-9]{32}/;
83
+ if (!format.test(certidao)) {
84
+ return false;
85
+ }
86
+ let dvOriginal = certidao.substr(-2);
87
+ const dv = create_certidao(certidao);
88
+ return dv === dvOriginal;
89
+ }
90
+ /**
91
+ *
92
+ * @param chassi
93
+ */
94
+ export function validate_chassi(chassi) {
95
+ // 1 - Possuir o número "0" (ZERO) como 1º dígito.
96
+ const zeroNoPrimeiroDigito = /^0/;
97
+ if (zeroNoPrimeiroDigito.test(chassi)) {
98
+ return false;
99
+ }
100
+ // 2 - Possuir espaço no chassi
101
+ chassi = getAllWords(chassi); // espacoNoChassi
102
+ // 3 - Se, a partir do 4º dígito, houver uma repetição consecutiva, por mais de seis vezes, do mesmo dígito
103
+ // (alfabético ou numérico). Exemplos: 9BW11111119452687 e 9BWZZZ5268AAAAAAA.
104
+ const repeticaoMaisDe6Vezes = /^.{4,}([0-9A-Z])\1{5,}/;
105
+ if (repeticaoMaisDe6Vezes.test(chassi)) {
106
+ return false;
107
+ }
108
+ // 4 - Apresente os caracteres "i", "I", "o", "O", "q", "Q".
109
+ const caracteresiIoOqQ = /[iIoOqQ]/;
110
+ if (caracteresiIoOqQ.test(chassi)) {
111
+ return false;
112
+ }
113
+ // 5 - Os quatro últimos caracteres devem ser obrigatoriamente numéricos
114
+ const ultimos4Numericos = /[0-9]{4}$/;
115
+ if (!ultimos4Numericos.test(chassi)) {
116
+ return false;
117
+ }
118
+ // 6 - Se possuir número de dígitos diferente de 17 (alfanuméricos).
119
+ if (chassi.length > 17) {
120
+ return false;
121
+ }
122
+ return true;
123
+ }
124
+ function validate_cnae(number) {
125
+ if (!number)
126
+ return true;
127
+ return false;
128
+ }
129
+ /**
130
+ *
131
+ * II - Número do Espelho da CNH - segundo número de identificação nacional,
132
+ * que será formado por 9 (nove) caracteres mais 1 (um) dígito verificador de segurança,
133
+ * autorizado e controlado pelo DENATRAN, e identificará cada espelho de CNH expedida.
134
+ * https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/resolucoes-contran
135
+ * https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf
136
+ * 598: https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao59820162.pdf
137
+ * @param value
138
+ */
139
+ export function validate_cnhespelho(value) {
140
+ value = value.replace(/[^\d]/g, '');
141
+ if (value.length !== 10) {
142
+ return false;
143
+ }
144
+ let check = create_cnhespelho(value);
145
+ if (check === '0' || check === '1')
146
+ check = '0';
147
+ return value.substr(-1) == check;
148
+ }
149
+ /**
150
+ *
151
+ * III – Número do formulário RENACH - número de identificação
152
+ * estadual, documento de coleta de dados do candidato/condutor gerado a cada serviço,
153
+ * composto, obrigatoriamente, por 11 (onze) caracteres, sendo as duas primeiras
154
+ * posições formadas pela sigla da Unidade de Federação expedidora, facultada a
155
+ * utilização da última posição como dígito verificador de segurança.
156
+ * a) O número do formulário RENACH identificará a Unidade da
157
+ * Federação onde o condutor foi habilitado ou realizou alterações de dados no seu
158
+ * cadastro pela última vez.
159
+ * b) O Formulário RENACH que dá origem às informações na
160
+ * BINCO e autorização para a impressão da CNH deverá ficar arquivado em seg
161
+ * 598 - https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao59820162.pdf
162
+ * 718 - https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7182017.pdf
163
+ * @param value
164
+ */
165
+ export function validate_renachestadual(value) {
166
+ const state = value.substr(0, 2).toLowerCase();
167
+ if (!ESTADOS_SIGLA.includes(state)) {
168
+ return false;
169
+ }
170
+ let digits = value.substr(2);
171
+ digits = digits.replace(/[^\d]/g, '');
172
+ if (digits.length !== 9) {
173
+ return false;
174
+ }
175
+ let check = create_renachestadual(value);
176
+ if (check === '0' || check === '1')
177
+ check = '0';
178
+ return value.substr(-1) == check;
179
+ }
180
+ export function validate_renachseguranca(value) {
181
+ value = value.replace(/[^\d]/g, '');
182
+ if (value.length !== 11) {
183
+ return false;
184
+ }
185
+ let check = create_renachseguranca(value);
186
+ return value.substr(-1) == check;
187
+ }
188
+ /**
189
+ * BINCO
190
+ * I – o primeiro número de identificação nacional – Registro Nacional,
191
+ * será gerado pelo sistema informatizado da Base Índice Nacional de Condutores –
192
+ * BINCO, composto de 9 (nove) caracteres mais 2 (dois) dígitos verificadores de
193
+ * segurança, sendo único para cada condutor e o acompanhará durante toda a
194
+ * sua existência como condutor, não sendo permitida a sua reutilização para
195
+ * outro condutor.
196
+ * @param value
197
+ * @returns
198
+ */
199
+ export function validate_cnh(value) {
200
+ value = value.toString().replace(/[^\d]/g, '');
201
+ if (value.length !== 11) {
202
+ return false;
203
+ }
204
+ let check = create_cnh(value);
205
+ return value.substr(-2) == check;
206
+ }
207
+ export function validate_cnpj(cnpj) {
208
+ // Valida se tem apenas número, - ou .
209
+ let precisaFicarVazio = cnpj.replace(/^[0-9./-]*$/gm, '');
210
+ if (precisaFicarVazio != '')
211
+ return false;
212
+ cnpj = cnpj.replace(/[^\d]+/g, '');
213
+ let tamanho = cnpj.length - 2;
214
+ const digitos = cnpj.substring(tamanho);
215
+ const resultados = create_cnpj(cnpj);
216
+ if (!resultados ||
217
+ resultados[0] !== parseInt(digitos.charAt(0), 10) ||
218
+ resultados[1] !== parseInt(digitos.charAt(1), 10)) {
219
+ return false;
220
+ }
221
+ return true;
222
+ }
223
+ function validate_contabanco(number) {
224
+ if (!number)
225
+ return false;
226
+ return true;
227
+ }
228
+ /**
229
+ * Referencia: http://www.receita.fazenda.gov.br/aplicacoes/atcta/funcoes.js
230
+ * @param strCPF
231
+ * @returns
232
+ */
233
+ export function validate_cpf(strCPF) {
234
+ // Valida se tem apenas número, - ou .
235
+ let precisaFicarVazio = strCPF.replace(/^[0-9.-]*$/gm, '');
236
+ if (precisaFicarVazio != '')
237
+ return false;
238
+ strCPF = strCPF.replace(/[^\d]+/g, '');
239
+ if (strCPF.length !== 11) {
240
+ return false;
241
+ }
242
+ //verifica se todos os numeros sao iguais
243
+ const expIguais = /^(?!.*(\d)\1{10}).*$/;
244
+ if (!strCPF.match(expIguais)) {
245
+ return false;
246
+ }
247
+ // valida digito verificados
248
+ const restos = create_cpf(strCPF);
249
+ if (!restos || restos != strCPF.substr(-2)) {
250
+ return false;
251
+ }
252
+ return true;
253
+ }
254
+ function validate_cpfcnpj(number) {
255
+ return validate_cpf(number) || validate_cnpj(number);
256
+ }
257
+ export function validate_cns(value) {
258
+ const cns = getAllDigits(value);
259
+ const definitivo = /[1-2][0-9]{10}00[0-1][0-9]/; // começam com 1 ou 2
260
+ const provisorio = /[7-9][0-9]{14}/; // começam com 7,8 ou 9
261
+ if (!definitivo.test(cns) && !provisorio.test(cns)) {
262
+ return false;
263
+ }
264
+ let soma = 0;
265
+ for (let i = 0; i < cns.length; i++) {
266
+ soma += parseInt(cns[i]) * (15 - i);
267
+ }
268
+ return soma % 11 == 0;
269
+ }
270
+ export function validate_cartaocredito(input) {
271
+ let value;
272
+ if (typeof input == 'string') {
273
+ value = getAllDigits(input);
274
+ }
275
+ else {
276
+ value = input.toString();
277
+ }
278
+ const number = value.slice(0, 16);
279
+ const mes = parseInt(value.slice(16, 18));
280
+ const ano = parseInt(value.slice(18, 20));
281
+ const cvv = value.slice(20, 23);
282
+ const d = new Date();
283
+ const anoAtual = (d.getFullYear() - 2000);
284
+ if (ano && ano < anoAtual) {
285
+ return false;
286
+ }
287
+ if (mes && mes < d.getMonth() + 1 && ano === anoAtual) {
288
+ return false;
289
+ }
290
+ if (cvv) {
291
+ const validcvv = validate_cvv(cvv);
292
+ if (validcvv.isValid === false) {
293
+ return false;
294
+ }
295
+ }
296
+ let found;
297
+ Object.keys(creditCardValidator).forEach(key => {
298
+ if (creditCardValidator[key].test(number)) {
299
+ found = key;
300
+ }
301
+ });
302
+ return !!found;
303
+ }
304
+ function validate_cvv(value, maxLength = 3) {
305
+ maxLength = maxLength instanceof Array ? maxLength : [maxLength];
306
+ if (typeof value !== 'string') {
307
+ return { isValid: false, isPotentiallyValid: false };
308
+ }
309
+ if (!/^\d*$/.test(value)) {
310
+ return { isValid: false, isPotentiallyValid: false };
311
+ }
312
+ var i = 0;
313
+ const max = value.length;
314
+ for (; i < maxLength.length; i++) {
315
+ if (max === maxLength[i]) {
316
+ return { isValid: true, isPotentiallyValid: true };
317
+ }
318
+ }
319
+ if (value.length < Math.min.apply(null, maxLength)) {
320
+ return { isValid: false, isPotentiallyValid: true };
321
+ }
322
+ var maximum = maxLength;
323
+ var i = 0;
324
+ for (; i < maxLength.length; i++) {
325
+ maximum = maxLength[i] > maximum ? maxLength[i] : maximum;
326
+ }
327
+ if (value.length > maximum) {
328
+ return { isValid: false, isPotentiallyValid: false };
329
+ }
330
+ return { isValid: true, isPotentiallyValid: true };
331
+ }
332
+ /**
333
+ * A hash of valid CC abbreviations and regular expressions
334
+ mc: Mastercard
335
+ ec: Eurocard
336
+ vi: Visa
337
+ ax: American Express
338
+ dc: Diners Club
339
+ bl: Carte Blanch
340
+ di: Discover
341
+ jcb: JCB
342
+ er: Enroute
343
+ */
344
+ export const creditCardValidator = {
345
+ 'mc': /5[1-5][0-9]{14}/,
346
+ 'ec': /5[1-5][0-9]{14}/,
347
+ 'vi': /4(?:[0-9]{12}|[0-9]{15})/,
348
+ 'ax': /3[47][0-9]{13}/,
349
+ 'dc': /3(?:0[0-5][0-9]{11}|[68][0-9]{12})/,
350
+ 'bl': /3(?:0[0-5][0-9]{11}|[68][0-9]{12})/,
351
+ 'di': /6011[0-9]{12}/,
352
+ 'jcb': /(?:3[0-9]{15}|(2131|1800)[0-9]{11})/,
353
+ 'er': /2(?:014|149)[0-9]{11}/
354
+ };
355
+ export function validate_currency(currency) {
356
+ if (typeof currency === 'number') {
357
+ return true;
358
+ }
359
+ const regex = /^(R\$|R\$ )?(-)?(?!0(\.)?00)\d{1,3}((\.)?\d{3})*(,\d\d)?$/g;
360
+ return regex.test(currency);
361
+ }
362
+ function validate_data(value) {
363
+ if (!value) {
364
+ return false;
365
+ }
366
+ const values = value.split('/');
367
+ if (values.length !== 3) {
368
+ return false;
369
+ }
370
+ const testData = new Date(values[1] + '/' + values[0] + '/' + values[2]);
371
+ if (!testData.getTime()) {
372
+ return false;
373
+ }
374
+ // if (parseInt(values[0]) > 31 || parseInt(values[1]) > 12 || parseInt(values[2]) < 1000) return false;
375
+ return true;
376
+ }
377
+ function validate_date(value) {
378
+ if (!value || value.length < 10) {
379
+ return false;
380
+ }
381
+ const testData = new Date(value);
382
+ if (!testData.getTime()) {
383
+ return false;
384
+ }
385
+ return true;
386
+ }
387
+ export function validate_datetime(time, options = {}) {
388
+ if (!time) {
389
+ return false;
390
+ }
391
+ time = time.toString();
392
+ const values = time.split(' ');
393
+ if (validate_date(values[0]) && validate_time(values[1], options)) {
394
+ return true;
395
+ }
396
+ return false;
397
+ }
398
+ export function validate_datahora(time, options = {}) {
399
+ if (!time) {
400
+ return false;
401
+ }
402
+ time = time.toString();
403
+ const values = time.split(' ');
404
+ if (validate_data(values[0]) && validate_time(values[1], options)) {
405
+ return true;
406
+ }
407
+ return false;
408
+ }
409
+ export function validate_ect(number) {
410
+ number = getAllDigits(number);
411
+ if (number.length > 9) {
412
+ return false;
413
+ }
414
+ const nodigit = number.substr(0, number.length - 1);
415
+ const dg = create_ect(nodigit);
416
+ if (parseInt(number[number.length - 1]) === dg) {
417
+ return true;
418
+ }
419
+ return false;
420
+ }
421
+ function validate_email(email) {
422
+ var re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
423
+ return re.test(String(email).toLowerCase());
424
+ }
425
+ function validate_endereco(number) {
426
+ if (!number)
427
+ return false;
428
+ return true;
429
+ }
430
+ export function validate_number(number) {
431
+ if (number.split(',').length > 2) {
432
+ return false;
433
+ }
434
+ const regexDecimal = /^\d+(?:\.\d{0,2})$/;
435
+ const regex = /^[0-9]{0,10}[,]{1,1}[0-9]{0,4}/;
436
+ const regexNumero = /^[0-9]{0,10}/;
437
+ return regexDecimal.test(number) || regex.test(number) || regexNumero.test(number);
438
+ }
439
+ export function validate_porcentagem(porcentagem) {
440
+ porcentagem = porcentagem.split('%')[0];
441
+ return validate_number(porcentagem);
442
+ }
443
+ export function validate_processo(processo) {
444
+ let processoClean = processo.replace(/\./g, '');
445
+ processoClean = processoClean.replace(/\-/g, '');
446
+ // const exp = /\d{7}\-\d{2}\.\d{4}\.\w{3}\.\d{4}/;
447
+ // const expClean = /\d{13}\w{3}\d{4}/;
448
+ // if (!exp.test(processo) && !expClean.test(processoClean)) {
449
+ // return false;
450
+ // }
451
+ let processoValidado = create_processo(processo);
452
+ if (parseInt(processoClean) !== parseInt(getAllDigits(processoValidado))) {
453
+ return false;
454
+ }
455
+ return true;
456
+ }
457
+ export function validate_pispasep(number) {
458
+ number = getAllDigits(number);
459
+ let nis = fillString(number, 11, '0');
460
+ const regex = /\d{11}/; // /^\d{3}\.\d{5}\.\d{2}\-\d{1}$/;
461
+ if (!regex.test(nis)) {
462
+ return false;
463
+ }
464
+ const digit = create_pispasep(number);
465
+ return nis[10].toString() == digit.toString();
466
+ }
467
+ export function validate_renavam(renavam) {
468
+ let renavamClean = renavam.replace(/\./g, '');
469
+ renavamClean = renavamClean.replace(/\-/g, '');
470
+ const dv = create_renavam(renavam);
471
+ const tam = renavam.length;
472
+ const digitos = renavam.substr(tam - 1, 1);
473
+ if (digitos.charCodeAt(0) - 48 === dv) {
474
+ return true;
475
+ }
476
+ else {
477
+ return false;
478
+ }
479
+ }
480
+ export function validate_rg(rg) {
481
+ let rgClean = rg.replace(/\./g, '');
482
+ rgClean = rgClean.replace(/-/g, '');
483
+ const exp = /[a-z]{2}\-\d{2}\.\d{3}\.\d{3}/;
484
+ const expClean = /[a-z]{2}\d{8}/;
485
+ const state = rg.substr(0, 2).toUpperCase();
486
+ if (!exp.test(rg) && !expClean.test(rgClean) && !(state in CEPRange)) {
487
+ return false;
488
+ }
489
+ const validateState = RG[state];
490
+ if (validateState) {
491
+ return validateState(rg);
492
+ }
493
+ return true;
494
+ }
495
+ function validate_senha(value, options = {}) {
496
+ let finalregex = '^';
497
+ // ^ The password string will start this way
498
+ // (?=.*[a-z]) The string must contain at least 1 lowercase alphabetical character
499
+ if (options.lowercase !== false) {
500
+ finalregex = finalregex + '(?=.*[a-z])';
501
+ }
502
+ // (?=.*[A-Z]) The string must contain at least 1 uppercase alphabetical character
503
+ if (options.uppercase !== false) {
504
+ finalregex = finalregex + '(?=.*[A-Z])';
505
+ }
506
+ // (?=.*[0-9]) The string must contain at least 1 numeric character
507
+ if (options.numeric !== false) {
508
+ finalregex = finalregex + '(?=.*[0-9])';
509
+ }
510
+ // (?=.*[!@#\$%\^&\*]) The string must contain at least one special character, but we are escaping reserved RegEx characters to avoid conflict
511
+ if (options.numeric !== false) {
512
+ finalregex = finalregex + '(?=.*[!@#\\$%\\^&\\*])';
513
+ }
514
+ // (?=.{8,}) The string must be eight characters or longer
515
+ if (!options.size) {
516
+ options.size = 8;
517
+ }
518
+ finalregex = finalregex + `(?=.{${options.size},})`;
519
+ const regex = new RegExp(finalregex);
520
+ return regex.test(value);
521
+ }
522
+ function validate_site(value) {
523
+ var re = /(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&=]*)/g;
524
+ return re.test(String(value).toLowerCase());
525
+ }
526
+ export function validate_sped(sped) {
527
+ if (!sped)
528
+ return false;
529
+ return true;
530
+ }
531
+ export function validate_telefone(tel) {
532
+ const telClean = tel.replace(/[^\d]+/g, '');
533
+ tel = tel.replace(/_/g, '');
534
+ if (!(telClean.length === 10 || telClean.length === 11)) {
535
+ return false;
536
+ }
537
+ if (telClean[0] == 0 || telClean[2] == 0) {
538
+ return false;
539
+ }
540
+ return true;
541
+ }
542
+ export function validate_time(time, options = {}) {
543
+ const value = time.toString();
544
+ if (options.diario) {
545
+ const expression = /^([0-1]?[0-9]|2[0-4]):([0-5][0-9])(:[0-5][0-9])?$/;
546
+ return expression.test(value);
547
+ }
548
+ else {
549
+ const expression = /^([0-9]?[0-9]):([0-5][0-9])(:[0-5][0-9])?$/;
550
+ return expression.test(value);
551
+ }
552
+ }
553
+ export function validate_titulo(titulo) {
554
+ if (!titulo) {
555
+ return false;
556
+ }
557
+ const tituloClean = titulo.replace(/\./g, '');
558
+ const exp = /\d{4}\.\d{4}\.\d{4}/;
559
+ const expClean = /\d{4}\d{4}\d{4}/;
560
+ if (!exp.test(tituloClean) && !expClean.test(tituloClean)) {
561
+ return false;
562
+ }
563
+ const tam = tituloClean.length;
564
+ let dig;
565
+ try {
566
+ dig = create_titulo_atual(tituloClean);
567
+ // const noDv = tituloClean.substr(0, tam - 2);
568
+ // dig = create_titulo(noDv);
569
+ }
570
+ catch (e) {
571
+ return false;
572
+ }
573
+ const digitos = tituloClean.substr(tam - 2, 2);
574
+ if (digitos === dig) {
575
+ return true;
576
+ }
577
+ else {
578
+ return false;
579
+ }
580
+ }
581
+ function validate_username(value) {
582
+ var re = /^[a-z0-9_-]{3,16}$/igm;
583
+ return re.test(String(value).toLowerCase());
584
+ }
585
+ export const validateBr = {
586
+ aih: validate_aih,
587
+ cartaocredito: validate_cartaocredito,
588
+ celular: validate_celular,
589
+ cep: validate_cep,
590
+ certidao: validate_certidao,
591
+ chassi: validate_chassi,
592
+ cnae: validate_cnae,
593
+ cnh: validate_cnh,
594
+ cnhespelho: validate_cnhespelho,
595
+ renachestadual: validate_renachestadual,
596
+ renachseguranca: validate_renachseguranca,
597
+ cnpj: validate_cnpj,
598
+ cns: validate_cns,
599
+ contabanco: validate_contabanco,
600
+ cpf: validate_cpf,
601
+ cpfcnpj: validate_cpfcnpj,
602
+ currency: validate_currency,
603
+ data: validate_data,
604
+ date: validate_date,
605
+ datetime: validate_datetime,
606
+ datahora: validate_datahora,
607
+ ect: validate_ect,
608
+ email: validate_email,
609
+ endereco: validate_endereco,
610
+ inscricaoestadual: validate_inscricaoestadual,
611
+ iptu: validate_iptu,
612
+ number: validate_number,
613
+ porcentagem: validate_porcentagem,
614
+ pispasep: validate_pispasep,
615
+ placa: validate_placa,
616
+ processo: validate_processo,
617
+ renavam: validate_renavam,
618
+ rg: validate_rg,
619
+ senha: validate_senha,
620
+ site: validate_site,
621
+ sped: validate_sped,
622
+ telefone: validate_telefone,
623
+ time: validate_time,
624
+ titulo: validate_titulo,
625
+ username: validate_username
626
+ };
627
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBhLWxpYnJhcnktdWkvc3JjL2xpYi9jb3JlL2pzLWJyYXNpbC9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUNMLFdBQVcsRUFBRSxVQUFVLEVBQ3ZCLGNBQWMsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFDN0wsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUcxQyxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVc7SUFDdEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxPQUFPLFVBQVUsS0FBSyxFQUFFLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFRO0lBQ3ZDLElBQUksUUFBUSxHQUFH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ZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBCaWdPYmplY3QgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVfaW5zY3JpY2FvZXN0YWR1YWwgfSBmcm9tICcuL2luc2NyaWNhb2VzdGFkdWFsJztcbmltcG9ydCB7IHZhbGlkYXRlX3BsYWNhIH0gZnJvbSAnLi9wbGFjYSc7XG5pbXBvcnQge1xuICBjcmVhdGVfY25waiwgY3JlYXRlX2NwZixcbiAgY3JlYXRlX3JlbmF2YW0sIGNyZWF0ZV9lY3QsIGNyZWF0ZV9wcm9jZXNzbywgY3JlYXRlX3RpdHVsb19hdHVhbCwgY3JlYXRlX2NuaCwgY3JlYXRlX2NlcnRpZGFvLCBjcmVhdGVfYWloLCBjcmVhdGVfcGlzcGFzZXAsIGNyZWF0ZV9jbmhlc3BlbGhvLCBjcmVhdGVfcmVuYWNoZXN0YWR1YWwsIGNyZWF0ZV9yZW5hY2hzZWd1cmFuY2Fcbn0gZnJvbSAnLi9jcmVhdGUnO1xuaW1wb3J0IFJHIGZyb20gJy4vcmcnO1xuaW1wb3J0IHsgdmFsaWRhdGVfaXB0dSB9IGZyb20gJy4vaXB0dSc7XG5pbXBvcnQgeyBFU1RBRE9TX1NJR0xBIH0gZnJvbSAnLi9lc3RhZG9zJztcblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfYWloKGFpaDogc3RyaW5nKSB7XG4gIGNvbnN0IGFpaENsZWFuID0gYWloLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICBjb25zdCBkdk9yaWdpbmFsID0gYWloQ2xlYW4uc3Vic3RyKC0xKTtcbiAgY29uc3QgZHYgPSBjcmVhdGVfYWloKGFpaENsZWFuKTtcbiAgcmV0dXJuIGR2T3JpZ2luYWwgPT09IGR2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY2VsdWxhcihjZWw6IGFueSkge1xuICBsZXQgY2VsQ2xlYW4gPSBjZWwucmVwbGFjZSgvW15cXGRdKy9nLCAnJyk7XG4gIGNlbENsZWFuID0gY2VsQ2xlYW4ucmVwbGFjZSgvXy9nLCAnJyk7XG4gIGlmIChjZWxDbGVhbi5sZW5ndGggIT09IDExKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChjZWxDbGVhblswXSA9PSAwIHx8IGNlbENsZWFuWzJdIDwgNSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IENFUFJhbmdlOiBCaWdPYmplY3Q8UmVnRXhwPiA9IHtcbiAgJ1NQJzogL14oWzFdWzAtOV17M318WzAxXVswLTldezR9KVswLTldezN9JC9nLFxuICAnUkonOiAvXlsyXVswLThdWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ01TJzogL15bN11bOV1bMC05XXszfVswLTldezN9JC9nLFxuICAnTUcnOiAvXlszXVswLTldezR9WzAtOV17M30kL2csXG4gICdNVCc6IC9eWzddWzhdWzhdWzAtOV17Mn1bMC05XXszfSQvZyxcbiAgJ0FDJzogL15bNl1bOV17Mn1bMC05XXsyfVswLTldezN9JC9nLFxuICAnQUwnOiAvXls1XVs3XVswLTldezN9WzAtOV17M30kL2csXG4gICdBTSc6IC9eWzZdWzldWzAtOF1bMC05XXsyfVswLTldezN9JC9nLFxuICAnQVAnOiAvXls2XVs4OV1bOV1bMC05XXsyfVswLTldezN9JC9nLFxuICAnQkEnOiAvXls0XVswLThdWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ0NFJzogL15bNl1bMC0zXVswLTldezN9WzAtOV17M30kL2csXG4gICdERic6IC9eWzddWzAtM11bMC02XVswLTldezJ9WzAtOV17M30kL2csXG4gICdFUyc6IC9eWzJdWzldWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ0dPJzogL15bN11bMy02XVs3LTldWzAtOV17Mn1bMC05XXszfSQvZyxcbiAgJ01BJzogL15bNl1bNV1bMC05XXszfVswLTldezN9JC9nLFxuICAnUEEnOiAvXls2XVs2LThdWzAtOF1bMC05XXsyfVswLTldezN9JC9nLFxuICAnUEInOiAvXls1XVs4XVswLTldezN9WzAtOV17M30kL2csXG4gICdQRSc6IC9eWzVdWzAtNl1bMC05XXsyfVswLTldezN9JC9nLFxuICAnUEknOiAvXls2XVs0XVswLTldezN9WzAtOV17M30kL2csXG4gICdQUic6IC9eWzhdWzAtN11bMC05XXszfVswLTldezN9JC9nLFxuICAnUk4nOiAvXls1XVs5XVswLTldezN9WzAtOV17M30kL2csXG4gICdSTyc6IC9eWzddWzhdWzldWzAtOV17Mn1bMC05XXszfSQvZyxcbiAgJ1JSJzogL15bNl1bOV1bM11bMC05XXsyfVswLTldezN9JC9nLFxuICAnUlMnOiAvXls5XVswLTldezR9WzAtOV17M30kL2csXG4gICdTQyc6IC9eWzhdWzg5XVswLTldezN9WzAtOV17M30kL2csXG4gICdTRSc6IC9eWzRdWzldWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ1RPJzogL15bN11bN11bMC05XXszfVswLTldezN9JC9nLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY2VwKGNlcDogc3RyaW5nKSB7XG4gIGNvbnN0IGNlcENsZWFuID0gY2VwLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICBjb25zdCBleHAgPSAvXFxkezJ9XFwuXFxkezN9XFwtXFxkezN9LztcbiAgaWYgKCFleHAudGVzdChjZXApICYmIGNlcENsZWFuLmxlbmd0aCAhPT0gOCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2VwX3JhbmdlcyhjZXA6IHN0cmluZyB8IG51bWJlcikge1xuICBjZXAgPSAoY2VwLnRvU3RyaW5nKCkpLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICBjZXAgPSBwYXJzZUludChjZXAsIDEwKTtcbiAgY29uc3QgY2VwU3RyaW5nOiBzdHJpbmcgPSBjZXAudG9TdHJpbmcoKTtcbiAgbGV0IGZvdW5kOiBhbnk7XG4gIGZvciAobGV0IGVzdGFkbyBpbiBDRVBSYW5nZSkge1xuICAgIGNvbnN0IHYgPSBDRVBSYW5nZVtlc3RhZG9dO1xuICAgIGNvbnN0IHIgPSBuZXcgUmVnRXhwKHYpLnRlc3QoY2VwU3RyaW5nKTtcbiAgICBpZiAocikge1xuICAgICAgZm91bmQgPSByO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFmb3VuZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2NlcnRpZGFvKHZhbHVlOiBzdHJpbmcpIHtcbiAgbGV0IGNlcnRpZGFvID0gZ2V0QWxsRGlnaXRzKHZhbHVlKTtcblxuICBjb25zdCBmb3JtYXQgPSAvWzAtOV17MzJ9LztcbiAgaWYgKCFmb3JtYXQudGVzdChjZXJ0aWRhbykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgZHZPcmlnaW5hbCA9IGNlcnRpZGFvLnN1YnN0cigtMik7XG4gIGNvbnN0IGR2ID0gY3JlYXRlX2NlcnRpZGFvKGNlcnRpZGFvKTtcblxuICByZXR1cm4gZHYgPT09IGR2T3JpZ2luYWw7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBjaGFzc2kgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9jaGFzc2koY2hhc3NpOiBzdHJpbmcpIHtcblxuICAvLyAxIC0gUG9zc3VpciBvIG7Dum1lcm8gXCIwXCIgKFpFUk8pIGNvbW8gMcK6IGTDrWdpdG8uXG4gIGNvbnN0IHplcm9Ob1ByaW1laXJvRGlnaXRvID0gL14wLztcbiAgaWYgKHplcm9Ob1ByaW1laXJvRGlnaXRvLnRlc3QoY2hhc3NpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIDIgLSBQb3NzdWlyIGVzcGHDp28gbm8gY2hhc3NpXG4gIGNoYXNzaSA9IGdldEFsbFdvcmRzKGNoYXNzaSk7IC8vIGVzcGFjb05vQ2hhc3NpXG5cbiAgLy8gMyAtIFNlLCBhIHBhcnRpciBkbyA0wrogZMOtZ2l0bywgaG91dmVyIHVtYSByZXBldGnDp8OjbyBjb25zZWN1dGl2YSwgcG9yIG1haXMgZGUgc2VpcyB2ZXplcywgZG8gbWVzbW8gZMOtZ2l0byBcbiAgLy8gKGFsZmFiw6l0aWNvIG91IG51bcOpcmljbykuIEV4ZW1wbG9zOiA5QlcxMTExMTExOTQ1MjY4NyBlIDlCV1paWjUyNjhBQUFBQUFBLlxuICBjb25zdCByZXBldGljYW9NYWlzRGU2VmV6ZXMgPSAvXi57NCx9KFswLTlBLVpdKVxcMXs1LH0vXG4gIGlmIChyZXBldGljYW9NYWlzRGU2VmV6ZXMudGVzdChjaGFzc2kpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gNCAtIEFwcmVzZW50ZSBvcyBjYXJhY3RlcmVzIFwiaVwiLCBcIklcIiwgXCJvXCIsIFwiT1wiLCBcInFcIiwgXCJRXCIuXG4gIGNvbnN0IGNhcmFjdGVyZXNpSW9PcVEgPSAvW2lJb09xUV0vO1xuICBpZiAoY2FyYWN0ZXJlc2lJb09xUS50ZXN0KGNoYXNzaSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyA1IC0gT3MgcXVhdHJvIMO6bHRpbW9zIGNhcmFjdGVyZXMgZGV2ZW0gc2VyIG9icmlnYXRvcmlhbWVudGUgbnVtw6lyaWNvc1xuICBjb25zdCB1bHRpbW9zNE51bWVyaWNvcyA9IC9bMC05XXs0fSQvO1xuICBpZiAoIXVsdGltb3M0TnVtZXJpY29zLnRlc3QoY2hhc3NpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIDYgLSBTZSBwb3NzdWlyIG7Dum1lcm8gZGUgZMOtZ2l0b3MgZGlmZXJlbnRlIGRlIDE3IChhbGZhbnVtw6lyaWNvcykuIFxuICBpZiAoY2hhc3NpLmxlbmd0aCA+IDE3KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX2NuYWUobnVtYmVyOiBhbnkpIHtcbiAgaWYgKCFudW1iZXIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBcbiAqIElJIC0gTsO6bWVybyBkbyBFc3BlbGhvIGRhIENOSCAtIHNlZ3VuZG8gbsO6bWVybyBkZSBpZGVudGlmaWNhw6fDo28gbmFjaW9uYWwsIFxuICogcXVlIHNlcsOhIGZvcm1hZG8gcG9yIDkgKG5vdmUpIGNhcmFjdGVyZXMgbWFpcyAxICh1bSkgZMOtZ2l0byB2ZXJpZmljYWRvciBkZSBzZWd1cmFuw6dhLCBcbiAqIGF1dG9yaXphZG8gZSBjb250cm9sYWRvIHBlbG8gREVOQVRSQU4sIGUgaWRlbnRpZmljYXLDoSBjYWRhIGVzcGVsaG8gZGUgQ05IIGV4cGVkaWRhLlxuICogaHR0cHM6Ly93d3cuZ292LmJyL2luZnJhZXN0cnV0dXJhL3B0LWJyL2Fzc3VudG9zL3RyYW5zaXRvL2NvbnRldWRvLWRlbmF0cmFuL3Jlc29sdWNvZXMtY29udHJhblxuICogaHR0cHM6Ly93d3cuZ292LmJyL2luZnJhZXN0cnV0dXJhL3B0LWJyL2Fzc3VudG9zL3RyYW5zaXRvL2NvbnRldWRvLWNvbnRyYW4vcmVzb2x1Y29lcy9yZXNvbHVjYW81MTEyMDE0LnBkZlxuICogNTk4OiBodHRwczovL3d3dy5nb3YuYnIvaW5mcmFlc3RydXR1cmEvcHQtYnIvYXNzdW50b3MvdHJhbnNpdG8vY29udGV1ZG8tY29udHJhbi9yZXNvbHVjb2VzL3Jlc29sdWNhbzU5ODIwMTYyLnBkZlxuICogQHBhcmFtIHZhbHVlIFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY25oZXNwZWxobyh2YWx1ZTogc3RyaW5nKSB7XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGRdL2csICcnKVxuICBpZiAodmFsdWUubGVuZ3RoICE9PSAxMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IGNoZWNrID0gY3JlYXRlX2NuaGVzcGVsaG8odmFsdWUpXG4gIGlmIChjaGVjayA9PT0gJzAnIHx8IGNoZWNrID09PSAnMScpIGNoZWNrID0gJzAnXG4gIHJldHVybiB2YWx1ZS5zdWJzdHIoLTEpID09IGNoZWNrXG59XG5cbi8qKlxuICogXG4gKiBJSUkg4oCTIE7Dum1lcm8gZG8gZm9ybXVsw6FyaW8gUkVOQUNIIC0gbsO6bWVybyBkZSBpZGVudGlmaWNhw6fDo29cbiogZXN0YWR1YWwsIGRvY3VtZW50byBkZSBjb2xldGEgZGUgZGFkb3MgZG8gY2FuZGlkYXRvL2NvbmR1dG9yIGdlcmFkbyBhIGNhZGEgc2VydmnDp28sXG4qIGNvbXBvc3RvLCBvYnJpZ2F0b3JpYW1lbnRlLCBwb3IgMTEgKG9uemUpIGNhcmFjdGVyZXMsIHNlbmRvIGFzIGR1YXMgcHJpbWVpcmFzXG4qIHBvc2nDp8O1ZXMgZm9ybWFkYXMgcGVsYSBzaWdsYSBkYSBVbmlkYWRlIGRlIEZlZGVyYcOnw6NvIGV4cGVkaWRvcmEsIGZhY3VsdGFkYSBhXG4qIHV0aWxpemHDp8OjbyBkYSDDumx0aW1hIHBvc2nDp8OjbyBjb21vIGTDrWdpdG8gdmVyaWZpY2Fkb3IgZGUgc2VndXJhbsOnYS5cbiogIGEpIE8gbsO6bWVybyBkbyBmb3JtdWzDoXJpbyBSRU5BQ0ggaWRlbnRpZmljYXLDoSBhIFVuaWRhZGUgZGFcbiogRmVkZXJhw6fDo28gb25kZSBvIGNvbmR1dG9yIGZvaSBoYWJpbGl0YWRvIG91IHJlYWxpem91IGFsdGVyYcOnw7VlcyBkZSBkYWRvcyBubyBzZXVcbiogY2FkYXN0cm8gcGVsYSDDumx0aW1hIHZlei5cbiogIGIpIE8gRm9ybXVsw6FyaW8gUkVOQUNIIHF1ZSBkw6Egb3JpZ2VtIMOgcyBpbmZvcm1hw6fDtWVzIG5hXG4qIEJJTkNPIGUgYXV0b3JpemHDp8OjbyBwYXJhIGEgaW1wcmVzc8OjbyBkYSBDTkggZGV2ZXLDoSBmaWNhciBhcnF1aXZhZG8gZW0gc2VnXG4qIDU5OCAtIGh0dHBzOi8vd3d3Lmdvdi5ici9pbmZyYWVzdHJ1dHVyYS9wdC1ici9hc3N1bnRvcy90cmFuc2l0by9jb250ZXVkby1jb250cmFuL3Jlc29sdWNvZXMvcmVzb2x1Y2FvNTk4MjAxNjIucGRmXG4qIDcxOCAtIGh0dHBzOi8vd3d3Lmdvdi5ici9pbmZyYWVzdHJ1dHVyYS9wdC1ici9hc3N1bnRvcy90cmFuc2l0by9jb250ZXVkby1jb250cmFuL3Jlc29sdWNvZXMvcmVzb2x1Y2FvNzE4MjAxNy5wZGZcbiogQHBhcmFtIHZhbHVlIFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcmVuYWNoZXN0YWR1YWwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlLnN1YnN0cigwLCAyKS50b0xvd2VyQ2FzZSgpXG4gIGlmICghRVNUQURPU19TSUdMQS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBkaWdpdHMgPSB2YWx1ZS5zdWJzdHIoMilcbiAgZGlnaXRzID0gZGlnaXRzLnJlcGxhY2UoL1teXFxkXS9nLCAnJyk7XG4gIGlmIChkaWdpdHMubGVuZ3RoICE9PSA5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBjaGVjayA9IGNyZWF0ZV9yZW5hY2hlc3RhZHVhbCh2YWx1ZSlcbiAgaWYgKGNoZWNrID09PSAnMCcgfHwgY2hlY2sgPT09ICcxJykgY2hlY2sgPSAnMCdcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cigtMSkgPT0gY2hlY2s7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9yZW5hY2hzZWd1cmFuY2EodmFsdWU6IHN0cmluZykge1xuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkXS9nLCAnJyk7XG5cbiAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgY2hlY2sgPSBjcmVhdGVfcmVuYWNoc2VndXJhbmNhKHZhbHVlKVxuICByZXR1cm4gdmFsdWUuc3Vic3RyKC0xKSA9PSBjaGVjaztcbn1cblxuLyoqXG4gKiBCSU5DT1xuICogSSDigJMgbyBwcmltZWlybyBuw7ptZXJvIGRlIGlkZW50aWZpY2HDp8OjbyBuYWNpb25hbCDigJMgUmVnaXN0cm8gTmFjaW9uYWwsIFxuICogc2Vyw6EgZ2VyYWRvIHBlbG8gc2lzdGVtYSBpbmZvcm1hdGl6YWRvIGRhIEJhc2Ugw41uZGljZSBOYWNpb25hbCBkZSBDb25kdXRvcmVzIOKAkyBcbiAqIEJJTkNPLCBjb21wb3N0byBkZSA5IChub3ZlKSBjYXJhY3RlcmVzIG1haXMgMiAoZG9pcykgZMOtZ2l0b3MgdmVyaWZpY2Fkb3JlcyBkZSBcbiAqIHNlZ3VyYW7Dp2EsIHNlbmRvIMO6bmljbyBwYXJhIGNhZGEgY29uZHV0b3IgZSBvIGFjb21wYW5oYXLDoSBkdXJhbnRlIHRvZGEgYSBcbiAqIHN1YSBleGlzdMOqbmNpYSBjb21vIGNvbmR1dG9yLCBuw6NvIHNlbmRvIHBlcm1pdGlkYSBhIHN1YSByZXV0aWxpemHDp8OjbyBwYXJhIFxuICogb3V0cm8gY29uZHV0b3IuXG4gKiBAcGFyYW0gdmFsdWUgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2NuaCh2YWx1ZTogc3RyaW5nKSB7XG4gIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9bXlxcZF0vZywgJycpO1xuICBpZiAodmFsdWUubGVuZ3RoICE9PSAxMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgY2hlY2sgPSBjcmVhdGVfY25oKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cigtMikgPT0gY2hlY2s7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9jbnBqKGNucGo6IGFueSkge1xuICAvLyBWYWxpZGEgc2UgdGVtIGFwZW5hcyBuw7ptZXJvLCAtIG91IC5cbiAgbGV0IHByZWNpc2FGaWNhclZhemlvID0gY25wai5yZXBsYWNlKC9eWzAtOS4vLV0qJC9nbSwgJycpXG4gIGlmIChwcmVjaXNhRmljYXJWYXppbyAhPSAnJylcbiAgICByZXR1cm4gZmFsc2VcblxuICBjbnBqID0gY25wai5yZXBsYWNlKC9bXlxcZF0rL2csICcnKTtcbiAgbGV0IHRhbWFuaG8gPSBjbnBqLmxlbmd0aCAtIDJcbiAgY29uc3QgZGlnaXRvcyA9IGNucGouc3Vic3RyaW5nKHRhbWFuaG8pO1xuICBjb25zdCByZXN1bHRhZG9zID0gY3JlYXRlX2NucGooY25waik7XG4gIGlmICghcmVzdWx0YWRvcyB8fFxuICAgIHJlc3VsdGFkb3NbMF0gIT09IHBhcnNlSW50KGRpZ2l0b3MuY2hhckF0KDApLCAxMCkgfHxcbiAgICByZXN1bHRhZG9zWzFdICE9PSBwYXJzZUludChkaWdpdG9zLmNoYXJBdCgxKSwgMTApXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX2NvbnRhYmFuY28obnVtYmVyOiBhbnkpIHtcbiAgaWYgKCFudW1iZXIpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2lhOiBodHRwOi8vd3d3LnJlY2VpdGEuZmF6ZW5kYS5nb3YuYnIvYXBsaWNhY29lcy9hdGN0YS9mdW5jb2VzLmpzXG4gKiBAcGFyYW0gc3RyQ1BGIFxuICogQHJldHVybnMgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9jcGYoc3RyQ1BGOiBhbnkpIHtcbiAgLy8gVmFsaWRhIHNlIHRlbSBhcGVuYXMgbsO6bWVybywgLSBvdSAuXG4gIGxldCBwcmVjaXNhRmljYXJWYXppbyA9IHN0ckNQRi5yZXBsYWNlKC9eWzAtOS4tXSokL2dtLCAnJylcbiAgaWYgKHByZWNpc2FGaWNhclZhemlvICE9ICcnKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIHN0ckNQRiA9IHN0ckNQRi5yZXBsYWNlKC9bXlxcZF0rL2csICcnKTtcbiAgaWYgKHN0ckNQRi5sZW5ndGggIT09IDExKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy92ZXJpZmljYSBzZSB0b2RvcyBvcyBudW1lcm9zIHNhbyBpZ3VhaXNcbiAgY29uc3QgZXhwSWd1YWlzID0gL14oPyEuKihcXGQpXFwxezEwfSkuKiQvO1xuICBpZiAoIXN0ckNQRi5tYXRjaChleHBJZ3VhaXMpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdmFsaWRhIGRpZ2l0byB2ZXJpZmljYWRvc1xuICBjb25zdCByZXN0b3MgPSBjcmVhdGVfY3BmKHN0ckNQRik7XG4gIGlmICghcmVzdG9zIHx8IHJlc3RvcyAhPSBzdHJDUEYuc3Vic3RyKC0yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVfY3BmY25waihudW1iZXI6IGFueSkge1xuICByZXR1cm4gdmFsaWRhdGVfY3BmKG51bWJlcikgfHwgdmFsaWRhdGVfY25waihudW1iZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY25zKHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgY25zID0gZ2V0QWxsRGlnaXRzKHZhbHVlKTtcbiAgY29uc3QgZGVmaW5pdGl2byA9IC9bMS0yXVswLTldezEwfTAwWzAtMV1bMC05XS87IC8vIGNvbWXDp2FtIGNvbSAxIG91IDJcbiAgY29uc3QgcHJvdmlzb3JpbyA9IC9bNy05XVswLTldezE0fS87ICAgICAgICAgICAgICAvLyBjb21lw6dhbSBjb20gNyw4IG91IDlcbiAgaWYgKCFkZWZpbml0aXZvLnRlc3QoY25zKSAmJiAhcHJvdmlzb3Jpby50ZXN0KGNucykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgc29tYSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY25zLmxlbmd0aDsgaSsrKSB7XG4gICAgc29tYSArPSBwYXJzZUludChjbnNbaV0pICogKDE1IC0gaSk7XG4gIH1cblxuICByZXR1cm4gc29tYSAlIDExID09IDA7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2NhcnRhb2NyZWRpdG8oaW5wdXQ6IHN0cmluZyB8IG51bWJlcikge1xuICBsZXQgdmFsdWU6IHN0cmluZztcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gZ2V0QWxsRGlnaXRzKGlucHV0KTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGlucHV0LnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCBudW1iZXIgPSB2YWx1ZS5zbGljZSgwLCAxNik7XG4gIGNvbnN0IG1lcyA9IHBhcnNlSW50KHZhbHVlLnNsaWNlKDE2LCAxOCkpO1xuICBjb25zdCBhbm8gPSBwYXJzZUludCh2YWx1ZS5zbGljZSgxOCwgMjApKTtcbiAgY29uc3QgY3Z2ID0gdmFsdWUuc2xpY2UoMjAsIDIzKTtcblxuICBjb25zdCBkID0gbmV3IERhdGUoKTtcbiAgY29uc3QgYW5vQXR1YWwgPSAoZC5nZXRGdWxsWWVhcigpIC0gMjAwMCk7XG4gIGlmIChhbm8gJiYgYW5vIDwgYW5vQXR1YWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG1lcyAmJiBtZXMgPCBkLmdldE1vbnRoKCkgKyAxICYmIGFubyA9PT0gYW5vQXR1YWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoY3Z2KSB7XG4gICAgY29uc3QgdmFsaWRjdnYgPSB2YWxpZGF0ZV9jdnYoY3Z2KTtcbiAgICBpZiAodmFsaWRjdnYuaXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBsZXQgZm91bmQ7XG4gIE9iamVjdC5rZXlzKGNyZWRpdENhcmRWYWxpZGF0b3IpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoY3JlZGl0Q2FyZFZhbGlkYXRvcltrZXldLnRlc3QobnVtYmVyKSkge1xuICAgICAgZm91bmQgPSBrZXk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuICEhZm91bmQ7XG5cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVfY3Z2KHZhbHVlOiBzdHJpbmcgfCBhbnlbXSwgbWF4TGVuZ3RoOiBhbnkgPSAzKSB7XG4gIG1heExlbmd0aCA9IG1heExlbmd0aCBpbnN0YW5jZW9mIEFycmF5ID8gbWF4TGVuZ3RoIDogW21heExlbmd0aF07XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgaXNQb3RlbnRpYWxseVZhbGlkOiBmYWxzZSB9O1xuICB9XG4gIGlmICghL15cXGQqJC8udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgaXNQb3RlbnRpYWxseVZhbGlkOiBmYWxzZSB9O1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICBjb25zdCBtYXggPSB2YWx1ZS5sZW5ndGg7XG4gIGZvciAoOyBpIDwgbWF4TGVuZ3RoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG1heCA9PT0gbWF4TGVuZ3RoW2ldKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IHRydWUgfTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoIDwgTWF0aC5taW4uYXBwbHkobnVsbCwgbWF4TGVuZ3RoKSkge1xuICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIHZhciBtYXhpbXVtID0gbWF4TGVuZ3RoO1xuICB2YXIgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBtYXhMZW5ndGgubGVuZ3RoOyBpKyspIHtcbiAgICBtYXhpbXVtID0gbWF4TGVuZ3RoW2ldID4gbWF4aW11bSA/IG1heExlbmd0aFtpXSA6IG1heGltdW07XG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoID4gbWF4aW11bSkge1xuICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IGZhbHNlIH07XG4gIH1cblxuICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IHRydWUgfTtcbn1cblxuXG4vKipcbiAqICAgICBBIGhhc2ggb2YgdmFsaWQgQ0MgYWJicmV2aWF0aW9ucyBhbmQgcmVndWxhciBleHByZXNzaW9uc1xuICAgIG1jOiBNYXN0ZXJjYXJkXG4gICAgZWM6IEV1cm9jYXJkXG4gICAgdmk6IFZpc2FcbiAgICBheDogQW1lcmljYW4gRXhwcmVzc1xuICAgIGRjOiBEaW5lcnMgQ2x1YlxuICAgIGJsOiBDYXJ0ZSBCbGFuY2hcbiAgICBkaTogRGlzY292ZXJcbiAgICBqY2I6IEpDQlxuICAgIGVyOiBFbnJvdXRlXG4qL1xuZXhwb3J0IGNvbnN0IGNyZWRpdENhcmRWYWxpZGF0b3I6IEJpZ09iamVjdDxSZWdFeHA+ID0ge1xuICAnbWMnOiAvNVsxLTVdWzAtOV17MTR9LyxcbiAgJ2VjJzogLzVbMS01XVswLTldezE0fS8sXG4gICd2aSc6IC80KD86WzAtOV17MTJ9fFswLTldezE1fSkvLFxuICAnYXgnOiAvM1s0N11bMC05XXsxM30vLFxuICAnZGMnOiAvMyg/OjBbMC01XVswLTldezExfXxbNjhdWzAtOV17MTJ9KS8sXG4gICdibCc6IC8zKD86MFswLTVdWzAtOV17MTF9fFs2OF1bMC05XXsxMn0pLyxcbiAgJ2RpJzogLzYwMTFbMC05XXsxMn0vLFxuICAnamNiJzogLyg/OjNbMC05XXsxNX18KDIxMzF8MTgwMClbMC05XXsxMX0pLyxcbiAgJ2VyJzogLzIoPzowMTR8MTQ5KVswLTldezExfS9cbn07XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2N1cnJlbmN5KGN1cnJlbmN5OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgaWYgKHR5cGVvZiBjdXJyZW5jeSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZWdleCA9IC9eKFJcXCR8UlxcJCApPygtKT8oPyEwKFxcLik/MDApXFxkezEsM30oKFxcLik/XFxkezN9KSooLFxcZFxcZCk/JC9nO1xuICByZXR1cm4gcmVnZXgudGVzdChjdXJyZW5jeSk7XG59XG5cblxuZnVuY3Rpb24gdmFsaWRhdGVfZGF0YSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KCcvJyk7XG4gIGlmICh2YWx1ZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHRlc3REYXRhOiBEYXRlID0gbmV3IERhdGUodmFsdWVzWzFdICsgJy8nICsgdmFsdWVzWzBdICsgJy8nICsgdmFsdWVzWzJdKVxuICBpZiAoIXRlc3REYXRhLmdldFRpbWUoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBpZiAocGFyc2VJbnQodmFsdWVzWzBdKSA+IDMxIHx8IHBhcnNlSW50KHZhbHVlc1sxXSkgPiAxMiB8fCBwYXJzZUludCh2YWx1ZXNbMl0pIDwgMTAwMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZV9kYXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoIDwgMTApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgdGVzdERhdGE6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKCF0ZXN0RGF0YS5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9kYXRldGltZSh0aW1lOiBzdHJpbmcgfCBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gIGlmICghdGltZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0aW1lID0gdGltZS50b1N0cmluZygpO1xuICBjb25zdCB2YWx1ZXMgPSB0aW1lLnNwbGl0KCcgJyk7XG4gIGlmICh2YWxpZGF0ZV9kYXRlKHZhbHVlc1swXSkgJiYgdmFsaWRhdGVfdGltZSh2YWx1ZXNbMV0sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9kYXRhaG9yYSh0aW1lOiBzdHJpbmcgfCBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gIGlmICghdGltZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0aW1lID0gdGltZS50b1N0cmluZygpO1xuICBjb25zdCB2YWx1ZXMgPSB0aW1lLnNwbGl0KCcgJyk7XG4gIGlmICh2YWxpZGF0ZV9kYXRhKHZhbHVlc1swXSkgJiYgdmFsaWRhdGVfdGltZSh2YWx1ZXNbMV0sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfZWN0KG51bWJlcjogc3RyaW5nKSB7XG4gIG51bWJlciA9IGdldEFsbERpZ2l0cyhudW1iZXIpO1xuICBpZiAobnVtYmVyLmxlbmd0aCA+IDkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IG5vZGlnaXQgPSBudW1iZXIuc3Vic3RyKDAsIG51bWJlci5sZW5ndGggLSAxKTtcbiAgY29uc3QgZGcgPSBjcmVhdGVfZWN0KG5vZGlnaXQpO1xuXG4gIGlmIChwYXJzZUludChudW1iZXJbbnVtYmVyLmxlbmd0aCAtIDFdKSA9PT0gZGcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX2VtYWlsKGVtYWlsOiBhbnkpIHtcbiAgdmFyIHJlID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC9cbiAgcmV0dXJuIHJlLnRlc3QoU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpKVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZV9lbmRlcmVjbyhudW1iZXI6IGFueSkge1xuICBpZiAoIW51bWJlcikgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9udW1iZXIobnVtYmVyOiBzdHJpbmcpIHtcbiAgaWYgKG51bWJlci5zcGxpdCgnLCcpLmxlbmd0aCA+IDIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCByZWdleERlY2ltYWwgPSAvXlxcZCsoPzpcXC5cXGR7MCwyfSkkLztcbiAgY29uc3QgcmVnZXggPSAvXlswLTldezAsMTB9WyxdezEsMX1bMC05XXswLDR9LztcbiAgY29uc3QgcmVnZXhOdW1lcm8gPSAvXlswLTldezAsMTB9LztcbiAgcmV0dXJuIHJlZ2V4RGVjaW1hbC50ZXN0KG51bWJlcikgfHwgcmVnZXgudGVzdChudW1iZXIpIHx8IHJlZ2V4TnVtZXJvLnRlc3QobnVtYmVyKTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcG9yY2VudGFnZW0ocG9yY2VudGFnZW06IHN0cmluZykge1xuICBwb3JjZW50YWdlbSA9IHBvcmNlbnRhZ2VtLnNwbGl0KCclJylbMF07XG4gIHJldHVybiB2YWxpZGF0ZV9udW1iZXIocG9yY2VudGFnZW0pO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9wcm9jZXNzbyhwcm9jZXNzbzogYW55KSB7XG4gIGxldCBwcm9jZXNzb0NsZWFuID0gcHJvY2Vzc28ucmVwbGFjZSgvXFwuL2csICcnKTtcbiAgcHJvY2Vzc29DbGVhbiA9IHByb2Nlc3NvQ2xlYW4ucmVwbGFjZSgvXFwtL2csICcnKTtcbiAgLy8gY29uc3QgZXhwID0gL1xcZHs3fVxcLVxcZHsyfVxcLlxcZHs0fVxcLlxcd3szfVxcLlxcZHs0fS87XG4gIC8vIGNvbnN0IGV4cENsZWFuID0gL1xcZHsxM31cXHd7M31cXGR7NH0vO1xuICAvLyBpZiAoIWV4cC50ZXN0KHByb2Nlc3NvKSAmJiAhZXhwQ2xlYW4udGVzdChwcm9jZXNzb0NsZWFuKSkge1xuICAvLyAgIHJldHVybiBmYWxzZTtcbiAgLy8gfVxuICBsZXQgcHJvY2Vzc29WYWxpZGFkbyA9IGNyZWF0ZV9wcm9jZXNzbyhwcm9jZXNzbyk7XG4gIGlmIChwYXJzZUludChwcm9jZXNzb0NsZWFuKSAhPT0gcGFyc2VJbnQoZ2V0QWxsRGlnaXRzKHByb2Nlc3NvVmFsaWRhZG8pKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcGlzcGFzZXAobnVtYmVyOiBzdHJpbmcpIHtcbiAgbnVtYmVyID0gZ2V0QWxsRGlnaXRzKG51bWJlcik7XG4gIGxldCBuaXMgPSBmaWxsU3RyaW5nKG51bWJlciwgMTEsICcwJyk7XG4gIGNvbnN0IHJlZ2V4ID0gL1xcZHsxMX0vOyAvLyAvXlxcZHszfVxcLlxcZHs1fVxcLlxcZHsyfVxcLVxcZHsxfSQvO1xuICBpZiAoIXJlZ2V4LnRlc3QobmlzKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRpZ2l0ID0gY3JlYXRlX3Bpc3Bhc2VwKG51bWJlcik7XG4gIHJldHVybiBuaXNbMTBdLnRvU3RyaW5nKCkgPT0gZGlnaXQudG9TdHJpbmcoKTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcmVuYXZhbShyZW5hdmFtOiBhbnkpIHtcbiAgbGV0IHJlbmF2YW1DbGVhbiA9IHJlbmF2YW0ucmVwbGFjZSgvXFwuL2csICcnKTtcbiAgcmVuYXZhbUNsZWFuID0gcmVuYXZhbUNsZWFuLnJlcGxhY2UoL1xcLS9nLCAnJyk7XG4gIGNvbnN0IGR2ID0gY3JlYXRlX3JlbmF2YW0ocmVuYXZhbSk7XG4gIGNvbnN0IHRhbSA9IHJlbmF2YW0ubGVuZ3RoO1xuICBjb25zdCBkaWdpdG9zID0gcmVuYXZhbS5zdWJzdHIodGFtIC0gMSwgMSk7XG4gIGlmIChkaWdpdG9zLmNoYXJDb2RlQXQoMCkgLSA0OCA9PT0gZHYpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9yZyhyZzogc3RyaW5nKSB7XG4gIGxldCByZ0NsZWFuID0gcmcucmVwbGFjZSgvXFwuL2csICcnKTtcbiAgcmdDbGVhbiA9IHJnQ2xlYW4ucmVwbGFjZSgvLS9nLCAnJyk7XG4gIGNvbnN0IGV4cCA9IC9bYS16XXsyfVxcLVxcZHsyfVxcLlxcZHszfVxcLlxcZHszfS87XG4gIGNvbnN0IGV4cENsZWFuID0gL1thLXpdezJ9XFxkezh9LztcbiAgY29uc3Qgc3RhdGUgPSByZy5zdWJzdHIoMCwgMikudG9VcHBlckNhc2UoKTtcblxuICBpZiAoIWV4cC50ZXN0KHJnKSAmJiAhZXhwQ2xlYW4udGVzdChyZ0NsZWFuKSAmJiAhKHN0YXRlIGluIENFUFJhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZGF0ZVN0YXRlID0gUkdbc3RhdGVdO1xuICBpZiAodmFsaWRhdGVTdGF0ZSkge1xuICAgIHJldHVybiB2YWxpZGF0ZVN0YXRlKHJnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVfc2VuaGEodmFsdWU6IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pIHtcbiAgbGV0IGZpbmFscmVnZXggPSAnXic7XG4gIC8vICAgXlx0VGhlIHBhc3N3b3JkIHN0cmluZyB3aWxsIHN0YXJ0IHRoaXMgd2F5XG4gIC8vICg/PS4qW2Etel0pXHRUaGUgc3RyaW5nIG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGxvd2VyY2FzZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyXG4gIGlmIChvcHRpb25zLmxvd2VyY2FzZSAhPT0gZmFsc2UpIHtcbiAgICBmaW5hbHJlZ2V4ID0gZmluYWxyZWdleCArICcoPz0uKlthLXpdKSc7XG4gIH1cbiAgLy8gKD89LipbQS1aXSlcdFRoZSBzdHJpbmcgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgdXBwZXJjYXNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXJcbiAgaWYgKG9wdGlvbnMudXBwZXJjYXNlICE9PSBmYWxzZSkge1xuICAgIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgJyg/PS4qW0EtWl0pJztcbiAgfVxuICAvLyAoPz0uKlswLTldKVx0VGhlIHN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBudW1lcmljIGNoYXJhY3RlclxuICBpZiAob3B0aW9ucy5udW1lcmljICE9PSBmYWxzZSkge1xuICAgIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgJyg/PS4qWzAtOV0pJztcbiAgfVxuICAvLyAoPz0uKlshQCNcXCQlXFxeJlxcKl0pXHRUaGUgc3RyaW5nIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgc3BlY2lhbCBjaGFyYWN0ZXIsIGJ1dCB3ZSBhcmUgZXNjYXBpbmcgcmVzZXJ2ZWQgUmVnRXggY2hhcmFjdGVycyB0byBhdm9pZCBjb25mbGljdFxuICBpZiAob3B0aW9ucy5udW1lcmljICE9PSBmYWxzZSkge1xuICAgIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgJyg/PS4qWyFAI1xcXFwkJVxcXFxeJlxcXFwqXSknO1xuICB9XG4gIC8vICg/PS57OCx9KVx0VGhlIHN0cmluZyBtdXN0IGJlIGVpZ2h0IGNoYXJhY3RlcnMgb3IgbG9uZ2VyXG4gIGlmICghb3B0aW9ucy5zaXplKSB7XG4gICAgb3B0aW9ucy5zaXplID0gODtcbiAgfVxuXG4gIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgYCg/PS57JHtvcHRpb25zLnNpemV9LH0pYDtcblxuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZmluYWxyZWdleCk7XG4gIHJldHVybiByZWdleC50ZXN0KHZhbHVlKTtcbn1cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZV9zaXRlKHZhbHVlOiBhbnkpIHtcbiAgdmFyIHJlID0gLyhodHRwKHMpPzpcXC9cXC8uKT8od3d3XFwuKT9bLWEtekEtWjAtOUA6JS5fXFwrfiM9XXsyLDI1Nn1cXC5bYS16XXsyLDZ9XFxiKFstYS16QS1aMC05QDolX1xcKy5+Iz8mPV0qKS9nO1xuICByZXR1cm4gcmUudGVzdChTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfc3BlZChzcGVkOiBzdHJpbmcpIHtcbiAgaWYgKCFzcGVkKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX3RlbGVmb25lKHRlbDogYW55KSB7XG4gIGNvbnN0IHRlbENsZWFuID0gdGVsLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICB0ZWwgPSB0ZWwucmVwbGFjZSgvXy9nLCAnJyk7XG4gIGlmICghKHRlbENsZWFuLmxlbmd0aCA9PT0gMTAgfHwgdGVsQ2xlYW4ubGVuZ3RoID09PSAxMSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHRlbENsZWFuWzBdID09IDAgfHwgdGVsQ2xlYW5bMl0gPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX3RpbWUodGltZTogc3RyaW5nIHwgbnVtYmVyLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICBjb25zdCB2YWx1ZSA9IHRpbWUudG9TdHJpbmcoKTtcbiAgaWYgKG9wdGlvbnMuZGlhcmlvKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IC9eKFswLTFdP1swLTldfDJbMC00XSk6KFswLTVdWzAtOV0pKDpbMC01XVswLTldKT8kLztcbiAgICByZXR1cm4gZXhwcmVzc2lvbi50ZXN0KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gL14oWzAtOV0/WzAtOV0pOihbMC01XVswLTldKSg6WzAtNV1bMC05XSk/JC87XG4gICAgcmV0dXJuIGV4cHJlc3Npb24udGVzdCh2YWx1ZSk7XG4gIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfdGl0dWxvKHRpdHVsbzogYW55KSB7XG4gIGlmICghdGl0dWxvKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHRpdHVsb0NsZWFuID0gdGl0dWxvLnJlcGxhY2UoL1xcLi9nLCAnJyk7XG4gIGNvbnN0IGV4cCA9IC9cXGR7NH1cXC5cXGR7NH1cXC5cXGR7NH0vO1xuICBjb25zdCBleHBDbGVhbiA9IC9cXGR7NH1cXGR7NH1cXGR7NH0vO1xuICBpZiAoIWV4cC50ZXN0KHRpdHVsb0NsZWFuKSAmJiAhZXhwQ2xlYW4udGVzdCh0aXR1bG9DbGVhbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB0YW0gPSB0aXR1bG9DbGVhbi5sZW5ndGg7XG5cbiAgbGV0IGRpZztcbiAgdHJ5IHtcbiAgICBkaWcgPSBjcmVhdGVfdGl0dWxvX2F0dWFsKHRpdHVsb0NsZWFuKTtcbiAgICAvLyBjb25zdCBub0R2ID0gdGl0dWxvQ2xlYW4uc3Vic3RyKDAsIHRhbSAtIDIpO1xuICAgIC8vIGRpZyA9IGNyZWF0ZV90aXR1bG8obm9Edik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBkaWdpdG9zID0gdGl0dWxvQ2xlYW4uc3Vic3RyKHRhbSAtIDIsIDIpO1xuICBpZiAoZGlnaXRvcyA9PT0gZGlnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX3VzZXJuYW1lKHZhbHVlOiBhbnkpIHtcbiAgdmFyIHJlID0gL15bYS16MC05Xy1dezMsMTZ9JC9pZ207XG4gIHJldHVybiByZS50ZXN0KFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKSk7XG59XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUJyOiBCaWdPYmplY3Q8RnVuY3Rpb24+ID0ge1xuICBhaWg6IHZhbGlkYXRlX2FpaCxcbiAgY2FydGFvY3JlZGl0bzogdmFsaWRhdGVfY2FydGFvY3JlZGl0byxcbiAgY2VsdWxhcjogdmFsaWRhdGVfY2VsdWxhcixcbiAgY2VwOiB2YWxpZGF0ZV9jZXAsXG4gIGNlcnRpZGFvOiB2YWxpZGF0ZV9jZXJ0aWRhbyxcbiAgY2hhc3NpOiB2YWxpZGF0ZV9jaGFzc2ksXG4gIGNuYWU6IHZhbGlkYXRlX2NuYWUsXG4gIGNuaDogdmFsaWRhdGVfY25oLFxuICBjbmhlc3BlbGhvOiB2YWxpZGF0ZV9jbmhlc3BlbGhvLFxuICByZW5hY2hlc3RhZHVhbDogdmFsaWRhdGVfcmVuYWNoZXN0YWR1YWwsXG4gIHJlbmFjaHNlZ3VyYW5jYTogdmFsaWRhdGVfcmVuYWNoc2VndXJhbmNhLFxuICBjbnBqOiB2YWxpZGF0ZV9jbnBqLFxuICBjbnM6IHZhbGlkYXRlX2NucyxcbiAgY29udGFiYW5jbzogdmFsaWRhdGVfY29udGFiYW5jbyxcbiAgY3BmOiB2YWxpZGF0ZV9jcGYsXG4gIGNwZmNucGo6IHZhbGlkYXRlX2NwZmNucGosXG4gIGN1cnJlbmN5OiB2YWxpZGF0ZV9jdXJyZW5jeSxcbiAgZGF0YTogdmFsaWRhdGVfZGF0YSxcbiAgZGF0ZTogdmFsaWRhdGVfZGF0ZSxcbiAgZGF0ZXRpbWU6IHZhbGlkYXRlX2RhdGV0aW1lLFxuICBkYXRhaG9yYTogdmFsaWRhdGVfZGF0YWhvcmEsXG4gIGVjdDogdmFsaWRhdGVfZWN0LFxuICBlbWFpbDogdmFsaWRhdGVfZW1haWwsXG4gIGVuZGVyZWNvOiB2YWxpZGF0ZV9lbmRlcmVjbyxcbiAgaW5zY3JpY2FvZXN0YWR1YWw6IHZhbGlkYXRlX2luc2NyaWNhb2VzdGFkdWFsLFxuICBpcHR1OiB2YWxpZGF0ZV9pcHR1LFxuICBudW1iZXI6IHZhbGlkYXRlX251bWJlcixcbiAgcG9yY2VudGFnZW06IHZhbGlkYXRlX3BvcmNlbnRhZ2VtLFxuICBwaXNwYXNlcDogdmFsaWRhdGVfcGlzcGFzZXAsXG4gIHBsYWNhOiB2YWxpZGF0ZV9wbGFjYSxcbiAgcHJvY2Vzc286IHZhbGlkYXRlX3Byb2Nlc3NvLFxuICByZW5hdmFtOiB2YWxpZGF0ZV9yZW5hdmFtLFxuICByZzogdmFsaWRhdGVfcmcsXG4gIHNlbmhhOiB2YWxpZGF0ZV9zZW5oYSxcbiAgc2l0ZTogdmFsaWRhdGVfc2l0ZSxcbiAgc3BlZDogdmFsaWRhdGVfc3BlZCxcbiAgdGVsZWZvbmU6IHZhbGlkYXRlX3RlbGVmb25lLFxuICB0aW1lOiB2YWxpZGF0ZV90aW1lLFxuICB0aXR1bG86IHZhbGlkYXRlX3RpdHVsbyxcbiAgdXNlcm5hbWU6IHZhbGlkYXRlX3VzZXJuYW1lXG59O1xuIl19