@seniorsistemas/data-seniorx-core 3.0.0 → 3.1.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.
- package/core/constants/editable-overlay.const.d.ts +4 -0
- package/core/constants/help-popover.const.d.ts +7 -0
- package/core/constants/input-mask.const.d.ts +5 -0
- package/core/constants/navigation-button.const.d.ts +3 -0
- package/core/constants/object-card.const.d.ts +21 -0
- package/core/constants/thumbnail.const.d.ts +6 -0
- package/core/constants/thumbnails.const.d.ts +4 -0
- package/core/constants/token-list.const.d.ts +3 -0
- package/core/types/button.type.d.ts +1 -1
- package/core/types/datepicker.type.d.ts +28 -0
- package/core/types/dynamic-form.type.d.ts +29 -0
- package/core/types/editable-overlay.type.d.ts +15 -0
- package/core/types/help-popover.type.d.ts +2 -0
- package/core/types/input-mask.type.d.ts +6 -0
- package/core/types/lookup.type.d.ts +45 -0
- package/core/types/navigation-button.type.d.ts +9 -0
- package/core/types/row-card.type.d.ts +5 -0
- package/core/types/semantics.type.d.ts +1 -1
- package/core/types/table-options.type.d.ts +1 -0
- package/core/types/thumbnail.type.d.ts +1 -0
- package/core/types/thumbnails.type.d.ts +20 -0
- package/core/types/token-list.type.d.ts +6 -0
- package/core/utils/emoji-support.util.d.ts +12 -0
- package/core/utils/overlay-dismiss.util.d.ts +25 -0
- package/esm2022/core/config/row-card.type.config.mjs +3 -1
- package/esm2022/core/constants/country-phone-picker.const.mjs +6 -6
- package/esm2022/core/constants/editable-overlay.const.mjs +5 -0
- package/esm2022/core/constants/help-popover.const.mjs +7 -0
- package/esm2022/core/constants/input-mask.const.mjs +6 -0
- package/esm2022/core/constants/navigation-button.const.mjs +4 -0
- package/esm2022/core/constants/object-card.const.mjs +23 -0
- package/esm2022/core/constants/thumbnail.const.mjs +14 -0
- package/esm2022/core/constants/thumbnails.const.mjs +5 -0
- package/esm2022/core/constants/token-list.const.mjs +4 -0
- package/esm2022/core/types/button.type.mjs +1 -1
- package/esm2022/core/types/datepicker.type.mjs +2 -0
- package/esm2022/core/types/dynamic-form.type.mjs +2 -0
- package/esm2022/core/types/editable-overlay.type.mjs +2 -0
- package/esm2022/core/types/help-popover.type.mjs +2 -0
- package/esm2022/core/types/input-mask.type.mjs +2 -0
- package/esm2022/core/types/lookup.type.mjs +2 -0
- package/esm2022/core/types/navigation-button.type.mjs +2 -0
- package/esm2022/core/types/row-card.type.mjs +1 -1
- package/esm2022/core/types/semantics.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/thumbnail.type.mjs +2 -0
- package/esm2022/core/types/thumbnails.type.mjs +2 -0
- package/esm2022/core/types/token-list.type.mjs +2 -0
- package/esm2022/core/utils/emoji-support.util.mjs +48 -0
- package/esm2022/core/utils/mask.util.mjs +2 -2
- package/esm2022/core/utils/overlay-dismiss.util.mjs +38 -0
- package/esm2022/features/alert/alert.component.mjs +5 -2
- package/esm2022/features/autocomplete/autocomplete.component.mjs +30 -8
- package/esm2022/features/bignumber-input/bignumber-input.component.mjs +1 -1
- package/esm2022/features/button/button.component.mjs +13 -5
- package/esm2022/features/card-list/card/card.component.mjs +2 -2
- package/esm2022/features/card-list/card-list.component.mjs +2 -2
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +25 -5
- package/esm2022/features/chips/chips.component.mjs +3 -3
- package/esm2022/features/code-editor/code-editor.component.mjs +12 -3
- package/esm2022/features/combobox/combobox.component.mjs +3 -3
- package/esm2022/features/confirm/confirm.component.mjs +2 -2
- package/esm2022/features/context-selector/context-selector.component.mjs +1 -1
- package/esm2022/features/country-phone-picker/country-phone-picker.component.mjs +22 -18
- package/esm2022/features/currency/currency.component.mjs +3 -3
- package/esm2022/features/datepicker/datepicker.component.mjs +814 -0
- package/esm2022/features/dynamic-form/dynamic-form-field.directive.mjs +178 -0
- package/esm2022/features/dynamic-form/dynamic-form.component.mjs +60 -0
- package/esm2022/features/dynamic-form/dynamic-form.registry.mjs +13 -0
- package/esm2022/features/editable-overlay/editable-overlay-editor.directive.mjs +31 -0
- package/esm2022/features/editable-overlay/editable-overlay.component.mjs +217 -0
- package/esm2022/features/editor/editor.component.mjs +173 -0
- package/esm2022/features/empty-state/empty-state.component.mjs +3 -3
- package/esm2022/features/fileupload/fileupload.component.mjs +3 -3
- package/esm2022/features/help-popover/help-popover.component.mjs +204 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +3 -3
- package/esm2022/features/icon-picker/icon-picker.component.mjs +4 -4
- package/esm2022/features/image-cropper/image-cropper.component.mjs +2 -2
- package/esm2022/features/info-sign/info-sign.component.mjs +6 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +2 -2
- package/esm2022/features/input-mask/input-mask.directive.mjs +510 -0
- package/esm2022/features/list/list.component.mjs +2 -2
- package/esm2022/features/localized-number-input/localized-number-input.component.mjs +3 -3
- package/esm2022/features/lookup/lookup.component.mjs +351 -0
- package/esm2022/features/modal/modal.component.mjs +6 -3
- package/esm2022/features/modalc/modalc.component.mjs +6 -3
- package/esm2022/features/navigation-button/navigation-button.component.mjs +172 -0
- package/esm2022/features/number-input/number-input.component.mjs +10 -4
- package/esm2022/features/object-card/components/object-card-field/object-card-field.component.mjs +89 -0
- package/esm2022/features/object-card/components/object-card-main/object-card-main.component.mjs +114 -0
- package/esm2022/features/object-card/object-card.component.mjs +199 -0
- package/esm2022/features/password-strength/password-strength.component.mjs +3 -3
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +14 -4
- package/esm2022/features/popover/popover.component.mjs +29 -3
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +13 -4
- package/esm2022/features/rating-scale/rating-scale.component.mjs +24 -4
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +19 -4
- package/esm2022/features/row-card-list/row-card-list.component.mjs +12 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +3 -3
- package/esm2022/features/searchbox/searchbox.component.mjs +2 -2
- package/esm2022/features/select-button/select-button.component.mjs +26 -4
- package/esm2022/features/slider/slider.component.mjs +3 -3
- package/esm2022/features/split-button/split-button.component.mjs +1 -1
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +15 -18
- package/esm2022/features/spotlight/spotlight.component.mjs +2 -2
- package/esm2022/features/star-rating/star-rating.component.mjs +25 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +2 -2
- package/esm2022/features/table/table.component.mjs +30 -9
- package/esm2022/features/textarea/textarea.component.mjs +3 -3
- package/esm2022/features/thumbnail/thumbnail.component.mjs +86 -0
- package/esm2022/features/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +59 -0
- package/esm2022/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.mjs +25 -0
- package/esm2022/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.mjs +50 -0
- package/esm2022/features/thumbnails/thumbnails.component.mjs +76 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +13 -1
- package/esm2022/features/token-list/token-list.component.mjs +64 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2 -2
- package/esm2022/locales/en.json +409 -1
- package/esm2022/locales/es-CO.json +423 -2
- package/esm2022/locales/pt.json +1037 -630
- package/esm2022/providers/features.provider.mjs +20 -2
- package/esm2022/providers/primeng-config.provider.mjs +14 -128
- package/esm2022/providers/translate.provider.mjs +2 -2
- package/esm2022/public-api.mjs +31 -1
- package/features/alert/alert.component.d.ts +1 -0
- package/features/autocomplete/autocomplete.component.d.ts +9 -3
- package/features/button/button.component.d.ts +3 -1
- package/features/checkbox-list/checkbox-list.component.d.ts +8 -1
- package/features/code-editor/code-editor.component.d.ts +5 -1
- package/features/country-phone-picker/country-phone-picker.component.d.ts +3 -0
- package/features/datepicker/datepicker.component.d.ts +118 -0
- package/features/dynamic-form/dynamic-form-field.directive.d.ts +26 -0
- package/features/dynamic-form/dynamic-form.component.d.ts +15 -0
- package/features/dynamic-form/dynamic-form.registry.d.ts +11 -0
- package/features/editable-overlay/editable-overlay-editor.directive.d.ts +22 -0
- package/features/editable-overlay/editable-overlay.component.d.ts +60 -0
- package/features/editor/editor.component.d.ts +47 -0
- package/features/help-popover/help-popover.component.d.ts +81 -0
- package/features/info-sign/info-sign.component.d.ts +2 -1
- package/features/input-mask/input-mask.directive.d.ts +117 -0
- package/features/lookup/lookup.component.d.ts +104 -0
- package/features/modal/modal.component.d.ts +2 -1
- package/features/modalc/modalc.component.d.ts +2 -1
- package/features/navigation-button/navigation-button.component.d.ts +58 -0
- package/features/number-input/number-input.component.d.ts +3 -1
- package/features/object-card/components/object-card-field/object-card-field.component.d.ts +48 -0
- package/features/object-card/components/object-card-main/object-card-main.component.d.ts +57 -0
- package/features/object-card/object-card.component.d.ts +70 -0
- package/features/pin-code-field/pin-code-field.component.d.ts +6 -1
- package/features/popover/popover.component.d.ts +4 -1
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +5 -1
- package/features/rating-scale/rating-scale.component.d.ts +9 -1
- package/features/row-card-list/row-card/row-card.component.d.ts +6 -1
- package/features/row-card-list/row-card-list.component.d.ts +4 -1
- package/features/select-button/select-button.component.d.ts +9 -1
- package/features/star-rating/star-rating.component.d.ts +9 -1
- package/features/table/table.component.d.ts +2 -1
- package/features/thumbnail/thumbnail.component.d.ts +48 -0
- package/features/thumbnails/components/thumbnail-item/thumbnail-item.component.d.ts +29 -0
- package/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.d.ts +13 -0
- package/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.d.ts +19 -0
- package/features/thumbnails/thumbnails.component.d.ts +46 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +2 -0
- package/features/token-list/token-list.component.d.ts +31 -0
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +11288 -6613
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +12 -3
- package/providers/primeng-config.provider.d.ts +12 -0
- package/public-api.d.ts +38 -0
- package/src/locales/en.json +409 -1
- package/src/locales/es-CO.json +423 -2
- package/src/locales/pt.json +1037 -630
- package/styles/sdc-global-variables.scss +38 -0
- package/styles.css +132 -0
- package/styles.scss +2 -0
- package/esm2022/providers/custom/button.mjs +0 -93
- package/esm2022/providers/custom/toast.mjs +0 -75
- package/providers/custom/button.d.ts +0 -16
- package/providers/custom/toast.d.ts +0 -14
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { Directive, ElementRef, EventEmitter, Input, Output, Renderer2, forwardRef, inject } from '@angular/core';
|
|
2
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { INPUT_MASK_DEFAULT_AUTO_CLEAR, INPUT_MASK_DEFAULT_CHARACTER_PATTERN, INPUT_MASK_DEFAULT_SLOT_CHAR, INPUT_MASK_DEFAULT_UNMASK, INPUT_MASK_NAVIGATION_KEYS } from '../../core/constants/input-mask.const';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* @description Diretiva de máscara de entrada interativa para campos de texto.
|
|
7
|
+
*
|
|
8
|
+
* Aplique `sdcInputMask` em qualquer `<input>` para aplicar uma máscara de formatação,
|
|
9
|
+
* guiando a entrada do usuário com um padrão definido. Implementa `ControlValueAccessor`
|
|
10
|
+
* e `Validator` para integração nativa com Angular Forms (`ngModel`/`formControl`).
|
|
11
|
+
*
|
|
12
|
+
* **Tokens de máscara:**
|
|
13
|
+
* - `9` — dígito (0-9)
|
|
14
|
+
* - `a` — letra (conforme `characterPattern`, padrão `[A-Za-z]`)
|
|
15
|
+
* - `*` — alfanumérico (letra ou dígito)
|
|
16
|
+
* - Qualquer outro caractere é tratado como literal (ex: `.`, `-`, `/`, `(`, `)`)
|
|
17
|
+
* - `?` — tudo após esse ponto na máscara passa a ser opcional
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```html
|
|
21
|
+
* <!-- CPF -->
|
|
22
|
+
* <input type="text" sdcInputMask="999.999.999-99" [(ngModel)]="cpf" />
|
|
23
|
+
*
|
|
24
|
+
* <!-- CNPJ -->
|
|
25
|
+
* <input type="text" sdcInputMask="99.999.999/9999-99" [(ngModel)]="cnpj" />
|
|
26
|
+
*
|
|
27
|
+
* <!-- Telefone, retornando só os dígitos digitados -->
|
|
28
|
+
* <input type="text" sdcInputMask="(99) 99999-9999" [unmask]="true" [(ngModel)]="telefone" />
|
|
29
|
+
* ```
|
|
30
|
+
* @category Input
|
|
31
|
+
*/
|
|
32
|
+
export class InputMaskDirective {
|
|
33
|
+
/**
|
|
34
|
+
* Padrão da máscara. Tokens: `9` (dígito), `a` (letra), `*` (alfanumérico).
|
|
35
|
+
* Demais caracteres são literais. `?` torna o restante da máscara opcional.
|
|
36
|
+
*/
|
|
37
|
+
mask;
|
|
38
|
+
/**
|
|
39
|
+
* Caractere exibido nas posições ainda não preenchidas.
|
|
40
|
+
* @default '_'
|
|
41
|
+
*/
|
|
42
|
+
slotChar = INPUT_MASK_DEFAULT_SLOT_CHAR;
|
|
43
|
+
/**
|
|
44
|
+
* Quando `true`, o modelo recebe apenas os caracteres digitados pelo usuário,
|
|
45
|
+
* sem os literais da máscara. Quando `false`, o modelo recebe o valor completo
|
|
46
|
+
* incluindo literais.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
unmask = INPUT_MASK_DEFAULT_UNMASK;
|
|
50
|
+
/**
|
|
51
|
+
* Expressão regular usada para validar o token `a` (letra).
|
|
52
|
+
* @default '[A-Za-z]'
|
|
53
|
+
*/
|
|
54
|
+
characterPattern = INPUT_MASK_DEFAULT_CHARACTER_PATTERN;
|
|
55
|
+
/**
|
|
56
|
+
* Quando `true`, limpa o campo ao perder o foco se a máscara estiver incompleta.
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
autoClear = INPUT_MASK_DEFAULT_AUTO_CLEAR;
|
|
60
|
+
/**
|
|
61
|
+
* Emitido quando todos os tokens obrigatórios da máscara estão preenchidos.
|
|
62
|
+
* Disparado apenas na transição de incompleto para completo (edge-triggered).
|
|
63
|
+
* Emite o valor atual (mascarado ou não, conforme `unmask`).
|
|
64
|
+
*/
|
|
65
|
+
maskComplete = new EventEmitter();
|
|
66
|
+
el = inject((ElementRef));
|
|
67
|
+
renderer = inject(Renderer2);
|
|
68
|
+
tokens = [];
|
|
69
|
+
buffer = [];
|
|
70
|
+
wasComplete = false;
|
|
71
|
+
lastValue = null;
|
|
72
|
+
onChange = () => { };
|
|
73
|
+
onTouched = () => { };
|
|
74
|
+
onValidatorChange = null;
|
|
75
|
+
ngOnInit() {
|
|
76
|
+
this.buildMask();
|
|
77
|
+
}
|
|
78
|
+
ngOnChanges(changes) {
|
|
79
|
+
if (changes['mask'] || changes['slotChar'] || changes['characterPattern']) {
|
|
80
|
+
this.buildMask();
|
|
81
|
+
if (this.mask) {
|
|
82
|
+
this.writeValue(this.lastValue);
|
|
83
|
+
}
|
|
84
|
+
// Só re-notifica o Reactive Forms em mudanças de mask POSTERIORES à primeira (ex.: o
|
|
85
|
+
// consumidor troca a máscara em runtime). Na primeira ligação, chamar isso de forma
|
|
86
|
+
// síncrona dispara um `updateValueAndValidity()` no meio do mesmo ciclo de criação em que
|
|
87
|
+
// o template já leu `control.invalid` — é exatamente esse `.invalid` mudando dentro do
|
|
88
|
+
// mesmo pass que o Angular sinaliza como NG0100 em modo dev. `NG_VALIDATORS`/
|
|
89
|
+
// `FormControlName` já roda a validação inicial sozinho quando o controle é configurado;
|
|
90
|
+
// não precisamos forçar uma segunda rodada nesse momento.
|
|
91
|
+
if (!changes['mask']?.firstChange) {
|
|
92
|
+
this.onValidatorChange?.();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
registerOnValidatorChange(fn) {
|
|
97
|
+
this.onValidatorChange = fn;
|
|
98
|
+
}
|
|
99
|
+
buildMask() {
|
|
100
|
+
if (!this.mask) {
|
|
101
|
+
this.tokens = [];
|
|
102
|
+
this.buffer = [];
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.tokens = this.parseMask(this.mask);
|
|
106
|
+
this.resetBuffer();
|
|
107
|
+
}
|
|
108
|
+
parseMask(mask) {
|
|
109
|
+
const tokens = [];
|
|
110
|
+
let optional = false;
|
|
111
|
+
for (const ch of mask) {
|
|
112
|
+
if (ch === '?') {
|
|
113
|
+
optional = true;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
tokens.push(this.buildToken(ch, optional));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return tokens;
|
|
120
|
+
}
|
|
121
|
+
buildToken(ch, optional) {
|
|
122
|
+
switch (ch) {
|
|
123
|
+
case '9':
|
|
124
|
+
return { type: 'digit', optional };
|
|
125
|
+
case 'a':
|
|
126
|
+
return { type: 'alpha', optional };
|
|
127
|
+
case '*':
|
|
128
|
+
return { type: 'alphanumeric', optional };
|
|
129
|
+
default:
|
|
130
|
+
return { type: 'literal', char: ch, optional: false };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
resetBuffer() {
|
|
134
|
+
this.buffer = this.tokens.map((t) => (t.type === 'literal' ? (t.char ?? '') : this.slotChar));
|
|
135
|
+
}
|
|
136
|
+
isValidChar(char, token) {
|
|
137
|
+
switch (token.type) {
|
|
138
|
+
case 'digit':
|
|
139
|
+
return /\d/.test(char);
|
|
140
|
+
case 'alpha':
|
|
141
|
+
return new RegExp(this.characterPattern).test(char);
|
|
142
|
+
case 'alphanumeric':
|
|
143
|
+
return /[A-Za-z0-9]/.test(char);
|
|
144
|
+
default:
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
isEditable(token) {
|
|
149
|
+
return token.type !== 'literal';
|
|
150
|
+
}
|
|
151
|
+
nextEditablePos(from) {
|
|
152
|
+
for (let i = from; i < this.tokens.length; i++) {
|
|
153
|
+
if (this.isEditable(this.tokens[i])) {
|
|
154
|
+
return i;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return this.tokens.length;
|
|
158
|
+
}
|
|
159
|
+
prevEditablePos(from) {
|
|
160
|
+
for (let i = from; i >= 0; i--) {
|
|
161
|
+
if (this.tokens[i] && this.isEditable(this.tokens[i])) {
|
|
162
|
+
return i;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return -1;
|
|
166
|
+
}
|
|
167
|
+
setCursor(pos) {
|
|
168
|
+
const safePos = Math.min(pos, this.tokens.length);
|
|
169
|
+
this.el.nativeElement.setSelectionRange(safePos, safePos);
|
|
170
|
+
}
|
|
171
|
+
setInputValue(value) {
|
|
172
|
+
this.renderer.setProperty(this.el.nativeElement, 'value', value);
|
|
173
|
+
}
|
|
174
|
+
getDisplayValue() {
|
|
175
|
+
return this.buffer.join('');
|
|
176
|
+
}
|
|
177
|
+
getBlurDisplayValue() {
|
|
178
|
+
let lastFilledIndex = -1;
|
|
179
|
+
for (let i = 0; i < this.buffer.length; i++) {
|
|
180
|
+
if (this.tokens[i] && this.tokens[i].type !== 'literal' && this.buffer[i] !== this.slotChar) {
|
|
181
|
+
lastFilledIndex = i;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (lastFilledIndex === -1) {
|
|
185
|
+
return '';
|
|
186
|
+
}
|
|
187
|
+
return this.buffer.slice(0, lastFilledIndex + 1).join('');
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Retorna o valor que deve ser propagado ao modelo.
|
|
191
|
+
* Retorna `null` quando o usuário não digitou nada.
|
|
192
|
+
*/
|
|
193
|
+
getModelValue() {
|
|
194
|
+
const hasInput = this.buffer.some((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar);
|
|
195
|
+
if (!hasInput) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
if (this.unmask) {
|
|
199
|
+
return (this.buffer
|
|
200
|
+
.filter((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar)
|
|
201
|
+
.join('') || null);
|
|
202
|
+
}
|
|
203
|
+
return this.buffer.join('');
|
|
204
|
+
}
|
|
205
|
+
clearRange(startPos, endPos) {
|
|
206
|
+
for (let i = startPos; i < endPos; i++) {
|
|
207
|
+
if (this.tokens[i] && this.tokens[i].type !== 'literal') {
|
|
208
|
+
this.buffer[i] = this.slotChar;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
this.setInputValue(this.getDisplayValue());
|
|
212
|
+
}
|
|
213
|
+
isMaskComplete() {
|
|
214
|
+
return this.tokens.every((token, i) => {
|
|
215
|
+
if (token.type === 'literal' || token.optional) {
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
return this.buffer[i] !== this.slotChar;
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
checkAndEmitComplete() {
|
|
222
|
+
const complete = this.isMaskComplete();
|
|
223
|
+
if (complete && !this.wasComplete) {
|
|
224
|
+
this.wasComplete = true;
|
|
225
|
+
this.maskComplete.emit(this.getModelValue() ?? '');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (!complete) {
|
|
229
|
+
this.wasComplete = false;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
dispatchInputEvent() {
|
|
233
|
+
this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true }));
|
|
234
|
+
}
|
|
235
|
+
onKeyDown(event) {
|
|
236
|
+
if (!this.mask || this.shouldIgnoreKeydown(event)) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const key = event.key;
|
|
240
|
+
const input = this.el.nativeElement;
|
|
241
|
+
const startPos = input.selectionStart ?? 0;
|
|
242
|
+
const endPos = input.selectionEnd ?? 0;
|
|
243
|
+
if (key === 'Backspace') {
|
|
244
|
+
event.preventDefault();
|
|
245
|
+
this.handleBackspace(startPos, endPos);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (key === 'Delete') {
|
|
249
|
+
event.preventDefault();
|
|
250
|
+
this.handleDelete(startPos, endPos);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
// Caractere único imprimível
|
|
254
|
+
if (key.length === 1) {
|
|
255
|
+
event.preventDefault();
|
|
256
|
+
this.handleCharacterInput(key, startPos, endPos);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
shouldIgnoreKeydown(event) {
|
|
260
|
+
if (this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
const key = event.key;
|
|
264
|
+
// Deixa o navegador tratar atalhos (Ctrl/Cmd), Tab e teclas de função
|
|
265
|
+
if (event.ctrlKey || event.metaKey || key === 'Tab' || key.startsWith('F')) {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
// Deixa o navegador tratar navegação por setas e Home/End nativamente
|
|
269
|
+
return INPUT_MASK_NAVIGATION_KEYS.includes(key);
|
|
270
|
+
}
|
|
271
|
+
handleBackspace(startPos, endPos) {
|
|
272
|
+
if (startPos !== endPos) {
|
|
273
|
+
this.clearRange(startPos, endPos);
|
|
274
|
+
const nextPos = this.nextEditablePos(startPos);
|
|
275
|
+
this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
|
|
276
|
+
this.finishEdit();
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (startPos > 0) {
|
|
280
|
+
const pos = this.prevEditablePos(startPos - 1);
|
|
281
|
+
if (pos >= 0) {
|
|
282
|
+
this.buffer[pos] = this.slotChar;
|
|
283
|
+
this.setInputValue(this.getDisplayValue());
|
|
284
|
+
this.setCursor(pos);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
this.finishEdit();
|
|
288
|
+
}
|
|
289
|
+
handleDelete(startPos, endPos) {
|
|
290
|
+
if (startPos !== endPos) {
|
|
291
|
+
this.clearRange(startPos, endPos);
|
|
292
|
+
const nextPos = this.nextEditablePos(startPos);
|
|
293
|
+
this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
|
|
294
|
+
this.finishEdit();
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const pos = this.nextEditablePos(startPos);
|
|
298
|
+
if (pos < this.tokens.length) {
|
|
299
|
+
this.buffer[pos] = this.slotChar;
|
|
300
|
+
this.setInputValue(this.getDisplayValue());
|
|
301
|
+
this.setCursor(pos);
|
|
302
|
+
}
|
|
303
|
+
this.finishEdit();
|
|
304
|
+
}
|
|
305
|
+
handleCharacterInput(key, startPos, endPos) {
|
|
306
|
+
let insertPos = startPos;
|
|
307
|
+
// Limpa a seleção, se houver
|
|
308
|
+
if (startPos !== endPos) {
|
|
309
|
+
this.clearRange(startPos, endPos);
|
|
310
|
+
insertPos = startPos;
|
|
311
|
+
}
|
|
312
|
+
const pos = this.nextEditablePos(insertPos);
|
|
313
|
+
if (pos >= this.tokens.length) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const token = this.tokens[pos];
|
|
317
|
+
if (!this.isValidChar(key, token)) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
this.buffer[pos] = key;
|
|
321
|
+
this.setInputValue(this.getDisplayValue());
|
|
322
|
+
const next = this.nextEditablePos(pos + 1);
|
|
323
|
+
this.setCursor(next <= this.tokens.length ? next : this.tokens.length);
|
|
324
|
+
this.finishEdit();
|
|
325
|
+
}
|
|
326
|
+
finishEdit() {
|
|
327
|
+
this.onChange(this.getModelValue());
|
|
328
|
+
this.checkAndEmitComplete();
|
|
329
|
+
this.dispatchInputEvent();
|
|
330
|
+
}
|
|
331
|
+
onFocus(_event) {
|
|
332
|
+
if (!this.mask) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
// Sempre restaura a exibição completa da máscara no foco (slots ficam visíveis)
|
|
336
|
+
this.setInputValue(this.getDisplayValue());
|
|
337
|
+
// Move o cursor para o primeiro slot editável vazio
|
|
338
|
+
const firstEmpty = this.buffer.findIndex((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch === this.slotChar);
|
|
339
|
+
this.setCursor(firstEmpty >= 0 ? firstEmpty : this.nextEditablePos(0));
|
|
340
|
+
}
|
|
341
|
+
onBlur(_event) {
|
|
342
|
+
if (!this.mask) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
this.onTouched();
|
|
346
|
+
if (!this.isMaskComplete()) {
|
|
347
|
+
if (this.autoClear) {
|
|
348
|
+
this.resetBuffer();
|
|
349
|
+
this.onChange(null);
|
|
350
|
+
}
|
|
351
|
+
this.setInputValue(this.getBlurDisplayValue());
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
onPaste(event) {
|
|
355
|
+
if (!this.mask || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
event.preventDefault();
|
|
359
|
+
const pastedText = event.clipboardData?.getData('text') ?? '';
|
|
360
|
+
const input = this.el.nativeElement;
|
|
361
|
+
const startPos = input.selectionStart ?? 0;
|
|
362
|
+
const endPos = input.selectionEnd ?? 0;
|
|
363
|
+
if (startPos !== endPos) {
|
|
364
|
+
this.clearRange(startPos, endPos);
|
|
365
|
+
}
|
|
366
|
+
const pos = this.consumePastedText(pastedText, startPos);
|
|
367
|
+
this.setInputValue(this.getDisplayValue());
|
|
368
|
+
this.setCursor(pos <= this.tokens.length ? pos : this.tokens.length);
|
|
369
|
+
this.finishEdit();
|
|
370
|
+
}
|
|
371
|
+
consumePastedText(pastedText, startPos) {
|
|
372
|
+
let pos = this.nextEditablePos(startPos);
|
|
373
|
+
for (const ch of pastedText) {
|
|
374
|
+
if (pos >= this.tokens.length) {
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
pos = this.consumePastedChar(ch, pos);
|
|
378
|
+
}
|
|
379
|
+
return pos;
|
|
380
|
+
}
|
|
381
|
+
consumePastedChar(ch, pos) {
|
|
382
|
+
const token = this.tokens[pos];
|
|
383
|
+
if (token.type === 'literal') {
|
|
384
|
+
// Pula o literal correspondente no texto colado; avança o slot literal de qualquer forma
|
|
385
|
+
const advanced = ch === token.char ? pos + 1 : pos;
|
|
386
|
+
return this.nextEditablePos(advanced);
|
|
387
|
+
}
|
|
388
|
+
if (this.isValidChar(ch, token)) {
|
|
389
|
+
this.buffer[pos] = ch;
|
|
390
|
+
return this.nextEditablePos(pos + 1);
|
|
391
|
+
}
|
|
392
|
+
return pos;
|
|
393
|
+
}
|
|
394
|
+
onClick() {
|
|
395
|
+
if (!this.mask || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
const input = this.el.nativeElement;
|
|
399
|
+
const pos = input.selectionStart ?? 0;
|
|
400
|
+
// Se o cursor caiu em um literal, empurra para o slot editável mais próximo
|
|
401
|
+
if (this.tokens[pos] && this.tokens[pos].type === 'literal') {
|
|
402
|
+
this.setCursor(this.nextEditablePos(pos));
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
writeValue(value) {
|
|
406
|
+
this.lastValue = value;
|
|
407
|
+
if (!this.mask) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
this.resetBuffer();
|
|
411
|
+
if (!value) {
|
|
412
|
+
this.setInputValue('');
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
let bufferIdx = 0;
|
|
416
|
+
let valueIdx = 0;
|
|
417
|
+
while (valueIdx < value.length && bufferIdx < this.tokens.length) {
|
|
418
|
+
const token = this.tokens[bufferIdx];
|
|
419
|
+
const char = value[valueIdx];
|
|
420
|
+
if (token.type === 'literal') {
|
|
421
|
+
// Consome o literal do valor se corresponder; sempre avança o buffer
|
|
422
|
+
if (char === token.char) {
|
|
423
|
+
valueIdx++;
|
|
424
|
+
}
|
|
425
|
+
bufferIdx++;
|
|
426
|
+
}
|
|
427
|
+
else if (this.isValidChar(char, token)) {
|
|
428
|
+
this.buffer[bufferIdx] = char;
|
|
429
|
+
bufferIdx++;
|
|
430
|
+
valueIdx++;
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
// Pula caracteres do valor que não correspondem ao slot atual
|
|
434
|
+
valueIdx++;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
this.setInputValue(this.getDisplayValue());
|
|
438
|
+
}
|
|
439
|
+
registerOnChange(onChange) {
|
|
440
|
+
this.onChange = onChange;
|
|
441
|
+
}
|
|
442
|
+
registerOnTouched(onTouched) {
|
|
443
|
+
this.onTouched = onTouched;
|
|
444
|
+
}
|
|
445
|
+
setDisabledState(isDisabled) {
|
|
446
|
+
this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);
|
|
447
|
+
}
|
|
448
|
+
validate(control) {
|
|
449
|
+
if (!this.mask || !control.value) {
|
|
450
|
+
return null;
|
|
451
|
+
}
|
|
452
|
+
if (!this.isMaskComplete()) {
|
|
453
|
+
return { incompleteMask: { mask: this.mask } };
|
|
454
|
+
}
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
458
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: InputMaskDirective, isStandalone: true, selector: "input[sdcInputMask]", inputs: { mask: ["sdcInputMask", "mask"], slotChar: "slotChar", unmask: "unmask", characterPattern: "characterPattern", autoClear: "autoClear" }, outputs: { maskComplete: "maskComplete" }, host: { listeners: { "keydown": "onKeyDown($event)", "focus": "onFocus($event)", "blur": "onBlur($event)", "paste": "onPaste($event)", "click": "onClick()" } }, providers: [
|
|
459
|
+
{
|
|
460
|
+
provide: NG_VALUE_ACCESSOR,
|
|
461
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
462
|
+
multi: true
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
provide: NG_VALIDATORS,
|
|
466
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
467
|
+
multi: true
|
|
468
|
+
}
|
|
469
|
+
], usesOnChanges: true, ngImport: i0 });
|
|
470
|
+
}
|
|
471
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, decorators: [{
|
|
472
|
+
type: Directive,
|
|
473
|
+
args: [{
|
|
474
|
+
selector: 'input[sdcInputMask]',
|
|
475
|
+
standalone: true,
|
|
476
|
+
host: {
|
|
477
|
+
'(keydown)': 'onKeyDown($event)',
|
|
478
|
+
'(focus)': 'onFocus($event)',
|
|
479
|
+
'(blur)': 'onBlur($event)',
|
|
480
|
+
'(paste)': 'onPaste($event)',
|
|
481
|
+
'(click)': 'onClick()'
|
|
482
|
+
},
|
|
483
|
+
providers: [
|
|
484
|
+
{
|
|
485
|
+
provide: NG_VALUE_ACCESSOR,
|
|
486
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
487
|
+
multi: true
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
provide: NG_VALIDATORS,
|
|
491
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
492
|
+
multi: true
|
|
493
|
+
}
|
|
494
|
+
]
|
|
495
|
+
}]
|
|
496
|
+
}], propDecorators: { mask: [{
|
|
497
|
+
type: Input,
|
|
498
|
+
args: ['sdcInputMask']
|
|
499
|
+
}], slotChar: [{
|
|
500
|
+
type: Input
|
|
501
|
+
}], unmask: [{
|
|
502
|
+
type: Input
|
|
503
|
+
}], characterPattern: [{
|
|
504
|
+
type: Input
|
|
505
|
+
}], autoClear: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], maskComplete: [{
|
|
508
|
+
type: Output
|
|
509
|
+
}] } });
|
|
510
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2lucHV0LW1hc2svaW5wdXQtbWFzay5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBaUIsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQXlDLGFBQWEsRUFBRSxpQkFBaUIsRUFBK0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0SSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLG9DQUFvQyxFQUNwQyw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMzQixNQUFNLHVDQUF1QyxDQUFDOztBQUcvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUF3QkgsTUFBTSxPQUFPLGtCQUFrQjtJQUM3Qjs7O09BR0c7SUFDb0IsSUFBSSxDQUFxQjtJQUVoRDs7O09BR0c7SUFDTSxRQUFRLEdBQVcsNEJBQTRCLENBQUM7SUFFekQ7Ozs7O09BS0c7SUFDTSxNQUFNLEdBQVkseUJBQXlCLENBQUM7SUFFckQ7OztPQUdHO0lBQ00sZ0JBQWdCLEdBQVcsb0NBQW9DLENBQUM7SUFFekU7OztPQUdHO0lBQ00sU0FBUyxHQUFZLDZCQUE2QixDQUFDO0lBRTVEOzs7O09BSUc7SUFDTyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUVuQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBNEIsQ0FBQSxDQUFDLENBQUM7SUFDMUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV0QyxNQUFNLEdBQXFCLEVBQUUsQ0FBQztJQUM5QixNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQ3RCLFdBQVcsR0FBRyxL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ZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gIElOUFVUX01BU0tfREVGQVVMVF9BVVRPX0NMRUFSLFxuICBJTlBVVF9NQVNLX0RFRkFVTFRfQ0hBUkFDVEVSX1BBVFRFUk4sXG4gIElOUFVUX01BU0tfREVGQVVMVF9TTE9UX0NIQVIsXG4gIElOUFVUX01BU0tfREVGQVVMVF9VTk1BU0ssXG4gIElOUFVUX01BU0tfTkFWSUdBVElPTl9LRVlTXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2lucHV0LW1hc2suY29uc3QnO1xuaW1wb3J0IHR5cGUgeyBJbnB1dE1hc2tUb2tlbiB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvaW5wdXQtbWFzay50eXBlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlyZXRpdmEgZGUgbcOhc2NhcmEgZGUgZW50cmFkYSBpbnRlcmF0aXZhIHBhcmEgY2FtcG9zIGRlIHRleHRvLlxuICpcbiAqIEFwbGlxdWUgYHNkY0lucHV0TWFza2AgZW0gcXVhbHF1ZXIgYDxpbnB1dD5gIHBhcmEgYXBsaWNhciB1bWEgbcOhc2NhcmEgZGUgZm9ybWF0YcOnw6NvLFxuICogZ3VpYW5kbyBhIGVudHJhZGEgZG8gdXN1w6FyaW8gY29tIHVtIHBhZHLDo28gZGVmaW5pZG8uIEltcGxlbWVudGEgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYFxuICogZSBgVmFsaWRhdG9yYCBwYXJhIGludGVncmHDp8OjbyBuYXRpdmEgY29tIEFuZ3VsYXIgRm9ybXMgKGBuZ01vZGVsYC9gZm9ybUNvbnRyb2xgKS5cbiAqXG4gKiAqKlRva2VucyBkZSBtw6FzY2FyYToqKlxuICogLSBgOWAg4oCUIGTDrWdpdG8gKDAtOSlcbiAqIC0gYGFgIOKAlCBsZXRyYSAoY29uZm9ybWUgYGNoYXJhY3RlclBhdHRlcm5gLCBwYWRyw6NvIGBbQS1aYS16XWApXG4gKiAtIGAqYCDigJQgYWxmYW51bcOpcmljbyAobGV0cmEgb3UgZMOtZ2l0bylcbiAqIC0gUXVhbHF1ZXIgb3V0cm8gY2FyYWN0ZXJlIMOpIHRyYXRhZG8gY29tbyBsaXRlcmFsIChleDogYC5gLCBgLWAsIGAvYCwgYChgLCBgKWApXG4gKiAtIGA/YCDigJQgdHVkbyBhcMOzcyBlc3NlIHBvbnRvIG5hIG3DoXNjYXJhIHBhc3NhIGEgc2VyIG9wY2lvbmFsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDwhLS0gQ1BGIC0tPlxuICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2RjSW5wdXRNYXNrPVwiOTk5Ljk5OS45OTktOTlcIiBbKG5nTW9kZWwpXT1cImNwZlwiIC8+XG4gKlxuICogPCEtLSBDTlBKIC0tPlxuICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2RjSW5wdXRNYXNrPVwiOTkuOTk5Ljk5OS85OTk5LTk5XCIgWyhuZ01vZGVsKV09XCJjbnBqXCIgLz5cbiAqXG4gKiA8IS0tIFRlbGVmb25lLCByZXRvcm5hbmRvIHPDsyBvcyBkw61naXRvcyBkaWdpdGFkb3MgLS0+XG4gKiA8aW5wdXQgdHlwZT1cInRleHRcIiBzZGNJbnB1dE1hc2s9XCIoOTkpIDk5OTk5LTk5OTlcIiBbdW5tYXNrXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInRlbGVmb25lXCIgLz5cbiAqIGBgYFxuICogQGNhdGVnb3J5IElucHV0XG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2lucHV0W3NkY0lucHV0TWFza10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgJyhrZXlkb3duKSc6ICdvbktleURvd24oJGV2ZW50KScsXG4gICAgJyhmb2N1cyknOiAnb25Gb2N1cygkZXZlbnQpJyxcbiAgICAnKGJsdXIpJzogJ29uQmx1cigkZXZlbnQpJyxcbiAgICAnKHBhc3RlKSc6ICdvblBhc3RlKCRldmVudCknLFxuICAgICcoY2xpY2spJzogJ29uQ2xpY2soKSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE1hc2tEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE1hc2tEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICAvKipcbiAgICogUGFkcsOjbyBkYSBtw6FzY2FyYS4gVG9rZW5zOiBgOWAgKGTDrWdpdG8pLCBgYWAgKGxldHJhKSwgYCpgIChhbGZhbnVtw6lyaWNvKS5cbiAgICogRGVtYWlzIGNhcmFjdGVyZXMgc8OjbyBsaXRlcmFpcy4gYD9gIHRvcm5hIG8gcmVzdGFudGUgZGEgbcOhc2NhcmEgb3BjaW9uYWwuXG4gICAqL1xuICBASW5wdXQoJ3NkY0lucHV0TWFzaycpIG1hc2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ2FyYWN0ZXJlIGV4aWJpZG8gbmFzIHBvc2nDp8O1ZXMgYWluZGEgbsOjbyBwcmVlbmNoaWRhcy5cbiAgICogQGRlZmF1bHQgJ18nXG4gICAqL1xuICBASW5wdXQoKSBzbG90Q2hhcjogc3RyaW5nID0gSU5QVVRfTUFTS19ERUZBVUxUX1NMT1RfQ0hBUjtcblxuICAvKipcbiAgICogUXVhbmRvIGB0cnVlYCwgbyBtb2RlbG8gcmVjZWJlIGFwZW5hcyBvcyBjYXJhY3RlcmVzIGRpZ2l0YWRvcyBwZWxvIHVzdcOhcmlvLFxuICAgKiBzZW0gb3MgbGl0ZXJhaXMgZGEgbcOhc2NhcmEuIFF1YW5kbyBgZmFsc2VgLCBvIG1vZGVsbyByZWNlYmUgbyB2YWxvciBjb21wbGV0b1xuICAgKiBpbmNsdWluZG8gbGl0ZXJhaXMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSB1bm1hc2s6IGJvb2xlYW4gPSBJTlBVVF9NQVNLX0RFRkFVTFRfVU5NQVNLO1xuXG4gIC8qKlxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgdXNhZGEgcGFyYSB2YWxpZGFyIG8gdG9rZW4gYGFgIChsZXRyYSkuXG4gICAqIEBkZWZhdWx0ICdbQS1aYS16XSdcbiAgICovXG4gIEBJbnB1dCgpIGNoYXJhY3RlclBhdHRlcm46IHN0cmluZyA9IElOUFVUX01BU0tfREVGQVVMVF9DSEFSQUNURVJfUEFUVEVSTjtcblxuICAvKipcbiAgICogUXVhbmRvIGB0cnVlYCwgbGltcGEgbyBjYW1wbyBhbyBwZXJkZXIgbyBmb2NvIHNlIGEgbcOhc2NhcmEgZXN0aXZlciBpbmNvbXBsZXRhLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBhdXRvQ2xlYXI6IGJvb2xlYW4gPSBJTlBVVF9NQVNLX0RFRkFVTFRfQVVUT19DTEVBUjtcblxuICAvKipcbiAgICogRW1pdGlkbyBxdWFuZG8gdG9kb3Mgb3MgdG9rZW5zIG9icmlnYXTDs3Jpb3MgZGEgbcOhc2NhcmEgZXN0w6NvIHByZWVuY2hpZG9zLlxuICAgKiBEaXNwYXJhZG8gYXBlbmFzIG5hIHRyYW5zacOnw6NvIGRlIGluY29tcGxldG8gcGFyYSBjb21wbGV0byAoZWRnZS10cmlnZ2VyZWQpLlxuICAgKiBFbWl0ZSBvIHZhbG9yIGF0dWFsIChtYXNjYXJhZG8gb3UgbsOjbywgY29uZm9ybWUgYHVubWFza2ApLlxuICAgKi9cbiAgQE91dHB1dCgpIG1hc2tDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICBwcml2YXRlIHRva2VuczogSW5wdXRNYXNrVG9rZW5bXSA9IFtdO1xuICBwcml2YXRlIGJ1ZmZlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSB3YXNDb21wbGV0ZSA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2U6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkTWFzaygpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbWFzayddIHx8IGNoYW5nZXNbJ3Nsb3RDaGFyJ10gfHwgY2hhbmdlc1snY2hhcmFjdGVyUGF0dGVybiddKSB7XG4gICAgICB0aGlzLmJ1aWxkTWFzaygpO1xuICAgICAgaWYgKHRoaXMubWFzaykge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5sYXN0VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTw7MgcmUtbm90aWZpY2EgbyBSZWFjdGl2ZSBGb3JtcyBlbSBtdWRhbsOnYXMgZGUgbWFzayBQT1NURVJJT1JFUyDDoCBwcmltZWlyYSAoZXguOiBvXG4gICAgICAvLyBjb25zdW1pZG9yIHRyb2NhIGEgbcOhc2NhcmEgZW0gcnVudGltZSkuIE5hIHByaW1laXJhIGxpZ2HDp8OjbywgY2hhbWFyIGlzc28gZGUgZm9ybWFcbiAgICAgIC8vIHPDrW5jcm9uYSBkaXNwYXJhIHVtIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgIG5vIG1laW8gZG8gbWVzbW8gY2ljbG8gZGUgY3JpYcOnw6NvIGVtIHF1ZVxuICAgICAgLy8gbyB0ZW1wbGF0ZSBqw6EgbGV1IGBjb250cm9sLmludmFsaWRgIOKAlCDDqSBleGF0YW1lbnRlIGVzc2UgYC5pbnZhbGlkYCBtdWRhbmRvIGRlbnRybyBkb1xuICAgICAgLy8gbWVzbW8gcGFzcyBxdWUgbyBBbmd1bGFyIHNpbmFsaXphIGNvbW8gTkcwMTAwIGVtIG1vZG8gZGV2LiBgTkdfVkFMSURBVE9SU2AvXG4gICAgICAvLyBgRm9ybUNvbnRyb2xOYW1lYCBqw6Egcm9kYSBhIHZhbGlkYcOnw6NvIGluaWNpYWwgc296aW5obyBxdWFuZG8gbyBjb250cm9sZSDDqSBjb25maWd1cmFkbztcbiAgICAgIC8vIG7Do28gcHJlY2lzYW1vcyBmb3LDp2FyIHVtYSBzZWd1bmRhIHJvZGFkYSBuZXNzZSBtb21lbnRvLlxuICAgICAgaWYgKCFjaGFuZ2VzWydtYXNrJ10/LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2U/LigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE1hc2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2spIHtcbiAgICAgIHRoaXMudG9rZW5zID0gW107XG4gICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRva2VucyA9IHRoaXMucGFyc2VNYXNrKHRoaXMubWFzayk7XG4gICAgdGhpcy5yZXNldEJ1ZmZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1hc2sobWFzazogc3RyaW5nKTogSW5wdXRNYXNrVG9rZW5bXSB7XG4gICAgY29uc3QgdG9rZW5zOiBJbnB1dE1hc2tUb2tlbltdID0gW107XG4gICAgbGV0IG9wdGlvbmFsID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGNoIG9mIG1hc2spIHtcbiAgICAgIGlmIChjaCA9PT0gJz8nKSB7XG4gICAgICAgIG9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHRoaXMuYnVpbGRUb2tlbihjaCwgb3B0aW9uYWwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRva2VuKGNoOiBzdHJpbmcsIG9wdGlvbmFsOiBib29sZWFuKTogSW5wdXRNYXNrVG9rZW4ge1xuICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgIGNhc2UgJzknOlxuICAgICAgICByZXR1cm4geyB0eXBlOiAnZGlnaXQnLCBvcHRpb25hbCB9O1xuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdhbHBoYScsIG9wdGlvbmFsIH07XG4gICAgICBjYXNlICcqJzpcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2FscGhhbnVtZXJpYycsIG9wdGlvbmFsIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geyB0eXBlOiAnbGl0ZXJhbCcsIGNoYXI6IGNoLCBvcHRpb25hbDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QnVmZmVyKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdGhpcy50b2tlbnMubWFwKCh0KSA9PiAodC50eXBlID09PSAnbGl0ZXJhbCcgPyAodC5jaGFyID8/ICcnKSA6IHRoaXMuc2xvdENoYXIpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZENoYXIoY2hhcjogc3RyaW5nLCB0b2tlbjogSW5wdXRNYXNrVG9rZW4pOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RpZ2l0JzpcbiAgICAgICAgcmV0dXJuIC9cXGQvLnRlc3QoY2hhcik7XG4gICAgICBjYXNlICdhbHBoYSc6XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMuY2hhcmFjdGVyUGF0dGVybikudGVzdChjaGFyKTtcbiAgICAgIGNhc2UgJ2FscGhhbnVtZXJpYyc6XG4gICAgICAgIHJldHVybiAvW0EtWmEtejAtOV0vLnRlc3QoY2hhcik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0VkaXRhYmxlKHRva2VuOiBJbnB1dE1hc2tUb2tlbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0b2tlbi50eXBlICE9PSAnbGl0ZXJhbCc7XG4gIH1cblxuICBwcml2YXRlIG5leHRFZGl0YWJsZVBvcyhmcm9tOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdGhpcy50b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmlzRWRpdGFibGUodGhpcy50b2tlbnNbaV0pKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmV2RWRpdGFibGVQb3MoZnJvbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0aGlzLnRva2Vuc1tpXSAmJiB0aGlzLmlzRWRpdGFibGUodGhpcy50b2tlbnNbaV0pKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwcml2YXRlIHNldEN1cnNvcihwb3M6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNhZmVQb3MgPSBNYXRoLm1pbihwb3MsIHRoaXMudG9rZW5zLmxlbmd0aCk7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNhZmVQb3MsIHNhZmVQb3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEJsdXJEaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICBsZXQgbGFzdEZpbGxlZEluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJyAmJiB0aGlzLmJ1ZmZlcltpXSAhPT0gdGhpcy5zbG90Q2hhcikge1xuICAgICAgICBsYXN0RmlsbGVkSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFzdEZpbGxlZEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UoMCwgbGFzdEZpbGxlZEluZGV4ICsgMSkuam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBvIHZhbG9yIHF1ZSBkZXZlIHNlciBwcm9wYWdhZG8gYW8gbW9kZWxvLlxuICAgKiBSZXRvcm5hIGBudWxsYCBxdWFuZG8gbyB1c3XDoXJpbyBuw6NvIGRpZ2l0b3UgbmFkYS5cbiAgICovXG4gIHByaXZhdGUgZ2V0TW9kZWxWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBoYXNJbnB1dCA9IHRoaXMuYnVmZmVyLnNvbWUoXG4gICAgICAoY2gsIGkpID0+IHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJyAmJiBjaCAhPT0gdGhpcy5zbG90Q2hhclxuICAgICk7XG5cbiAgICBpZiAoIWhhc0lucHV0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy51bm1hc2spIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuYnVmZmVyXG4gICAgICAgICAgLmZpbHRlcigoY2gsIGkpID0+IHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJyAmJiBjaCAhPT0gdGhpcy5zbG90Q2hhcilcbiAgICAgICAgICAuam9pbignJykgfHwgbnVsbFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5idWZmZXIuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmFuZ2Uoc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRQb3M7IGkgPCBlbmRQb3M7IGkrKykge1xuICAgICAgaWYgKHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJykge1xuICAgICAgICB0aGlzLmJ1ZmZlcltpXSA9IHRoaXMuc2xvdENoYXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNNYXNrQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmV2ZXJ5KCh0b2tlbiwgaSkgPT4ge1xuICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaXRlcmFsJyB8fCB0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2ldICE9PSB0aGlzLnNsb3RDaGFyO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FuZEVtaXRDb21wbGV0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wbGV0ZSA9IHRoaXMuaXNNYXNrQ29tcGxldGUoKTtcblxuICAgIGlmIChjb21wbGV0ZSAmJiAhdGhpcy53YXNDb21wbGV0ZSkge1xuICAgICAgdGhpcy53YXNDb21wbGV0ZSA9IHRydWU7XG4gICAgICB0aGlzLm1hc2tDb21wbGV0ZS5lbWl0KHRoaXMuZ2V0TW9kZWxWYWx1ZSgpID8/ICcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbXBsZXRlKSB7XG4gICAgICB0aGlzLndhc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaElucHV0RXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gIH1cblxuICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgdGhpcy5zaG91bGRJZ25vcmVLZXlkb3duKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBzdGFydFBvcyA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG4gICAgY29uc3QgZW5kUG9zID0gaW5wdXQuc2VsZWN0aW9uRW5kID8/IDA7XG5cbiAgICBpZiAoa2V5ID09PSAnQmFja3NwYWNlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuaGFuZGxlQmFja3NwYWNlKHN0YXJ0UG9zLCBlbmRQb3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5oYW5kbGVEZWxldGUoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FyYWN0ZXJlIMO6bmljbyBpbXByaW3DrXZlbFxuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5oYW5kbGVDaGFyYWN0ZXJJbnB1dChrZXksIHN0YXJ0UG9zLCBlbmRQb3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkSWdub3JlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucmVhZE9ubHkgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICAvLyBEZWl4YSBvIG5hdmVnYWRvciB0cmF0YXIgYXRhbGhvcyAoQ3RybC9DbWQpLCBUYWIgZSB0ZWNsYXMgZGUgZnVuw6fDo29cbiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGtleSA9PT0gJ1RhYicgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRGVpeGEgbyBuYXZlZ2Fkb3IgdHJhdGFyIG5hdmVnYcOnw6NvIHBvciBzZXRhcyBlIEhvbWUvRW5kIG5hdGl2YW1lbnRlXG4gICAgcmV0dXJuIElOUFVUX01BU0tfTkFWSUdBVElPTl9LRVlTLmluY2x1ZGVzKGtleSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUJhY2tzcGFjZShzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChzdGFydFBvcyAhPT0gZW5kUG9zKSB7XG4gICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICBjb25zdCBuZXh0UG9zID0gdGhpcy5uZXh0RWRpdGFibGVQb3Moc3RhcnRQb3MpO1xuICAgICAgdGhpcy5zZXRDdXJzb3IobmV4dFBvcyA8IHRoaXMudG9rZW5zLmxlbmd0aCA/IG5leHRQb3MgOiBzdGFydFBvcyk7XG4gICAgICB0aGlzLmZpbmlzaEVkaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRQb3MgPiAwKSB7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLnByZXZFZGl0YWJsZVBvcyhzdGFydFBvcyAtIDEpO1xuXG4gICAgICBpZiAocG9zID49IDApIHtcbiAgICAgICAgdGhpcy5idWZmZXJbcG9zXSA9IHRoaXMuc2xvdENoYXI7XG4gICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcbiAgICAgICAgdGhpcy5zZXRDdXJzb3IocG9zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaEVkaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHN0YXJ0UG9zICE9PSBlbmRQb3MpIHtcbiAgICAgIHRoaXMuY2xlYXJSYW5nZShzdGFydFBvcywgZW5kUG9zKTtcbiAgICAgIGNvbnN0IG5leHRQb3MgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhzdGFydFBvcyk7XG4gICAgICB0aGlzLnNldEN1cnNvcihuZXh0UG9zIDwgdGhpcy50b2tlbnMubGVuZ3RoID8gbmV4dFBvcyA6IHN0YXJ0UG9zKTtcbiAgICAgIHRoaXMuZmluaXNoRWRpdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcyA9IHRoaXMubmV4dEVkaXRhYmxlUG9zKHN0YXJ0UG9zKTtcblxuICAgIGlmIChwb3MgPCB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYnVmZmVyW3Bvc10gPSB0aGlzLnNsb3RDaGFyO1xuICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0RGlzcGxheVZhbHVlKCkpO1xuICAgICAgdGhpcy5zZXRDdXJzb3IocG9zKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaEVkaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhcmFjdGVySW5wdXQoa2V5OiBzdHJpbmcsIHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGluc2VydFBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgLy8gTGltcGEgYSBzZWxlw6fDo28sIHNlIGhvdXZlclxuICAgIGlmIChzdGFydFBvcyAhPT0gZW5kUG9zKSB7XG4gICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICBpbnNlcnRQb3MgPSBzdGFydFBvcztcbiAgICB9XG5cbiAgICBjb25zdCBwb3MgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhpbnNlcnRQb3MpO1xuXG4gICAgaWYgKHBvcyA+PSB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5zW3Bvc107XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZENoYXIoa2V5LCB0b2tlbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlcltwb3NdID0ga2V5O1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcblxuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhwb3MgKyAxKTtcbiAgICB0aGlzLnNldEN1cnNvcihuZXh0IDw9IHRoaXMudG9rZW5zLmxlbmd0aCA/IG5leHQgOiB0aGlzLnRva2Vucy5sZW5ndGgpO1xuXG4gICAgdGhpcy5maW5pc2hFZGl0KCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaEVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldE1vZGVsVmFsdWUoKSk7XG4gICAgdGhpcy5jaGVja0FuZEVtaXRDb21wbGV0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hJbnB1dEV2ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cyhfZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNlbXByZSByZXN0YXVyYSBhIGV4aWJpw6fDo28gY29tcGxldGEgZGEgbcOhc2NhcmEgbm8gZm9jbyAoc2xvdHMgZmljYW0gdmlzw612ZWlzKVxuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcblxuICAgIC8vIE1vdmUgbyBjdXJzb3IgcGFyYSBvIHByaW1laXJvIHNsb3QgZWRpdMOhdmVsIHZhemlvXG4gICAgY29uc3QgZmlyc3RFbXB0eSA9IHRoaXMuYnVmZmVyLmZpbmRJbmRleChcbiAgICAgIChjaCwgaSkgPT4gdGhpcy50b2tlbnNbaV0gJiYgdGhpcy50b2tlbnNbaV0udHlwZSAhPT0gJ2xpdGVyYWwnICYmIGNoID09PSB0aGlzLnNsb3RDaGFyXG4gICAgKTtcblxuICAgIHRoaXMuc2V0Q3Vyc29yKGZpcnN0RW1wdHkgPj0gMCA/IGZpcnN0RW1wdHkgOiB0aGlzLm5leHRFZGl0YWJsZVBvcygwKSk7XG4gIH1cblxuICBwdWJsaWMgb25CbHVyKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgICBpZiAoIXRoaXMuaXNNYXNrQ29tcGxldGUoKSkge1xuICAgICAgaWYgKHRoaXMuYXV0b0NsZWFyKSB7XG4gICAgICAgIHRoaXMucmVzZXRCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldEJsdXJEaXNwbGF5VmFsdWUoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnJlYWRPbmx5IHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpID8/ICcnO1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmRQb3MgPSBpbnB1dC5zZWxlY3Rpb25FbmQgPz8gMDtcblxuICAgIGlmIChzdGFydFBvcyAhPT0gZW5kUG9zKSB7XG4gICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zID0gdGhpcy5jb25zdW1lUGFzdGVkVGV4dChwYXN0ZWRUZXh0LCBzdGFydFBvcyk7XG5cbiAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXREaXNwbGF5VmFsdWUoKSk7XG4gICAgdGhpcy5zZXRDdXJzb3IocG9zIDw9IHRoaXMudG9rZW5zLmxlbmd0aCA/IHBvcyA6IHRoaXMudG9rZW5zLmxlbmd0aCk7XG4gICAgdGhpcy5maW5pc2hFZGl0KCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVQYXN0ZWRUZXh0KHBhc3RlZFRleHQ6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHBvcyA9IHRoaXMubmV4dEVkaXRhYmxlUG9zKHN0YXJ0UG9zKTtcblxuICAgIGZvciAoY29uc3QgY2ggb2YgcGFzdGVkVGV4dCkge1xuICAgICAgaWYgKHBvcyA+PSB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHBvcyA9IHRoaXMuY29uc3VtZVBhc3RlZENoYXIoY2gsIHBvcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvcztcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVBhc3RlZENoYXIoY2g6IHN0cmluZywgcG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbnNbcG9zXTtcblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIC8vIFB1bGEgbyBsaXRlcmFsIGNvcnJlc3BvbmRlbnRlIG5vIHRleHRvIGNvbGFkbzsgYXZhbsOnYSBvIHNsb3QgbGl0ZXJhbCBkZSBxdWFscXVlciBmb3JtYVxuICAgICAgY29uc3QgYWR2YW5jZWQgPSBjaCA9PT0gdG9rZW4uY2hhciA/IHBvcyArIDEgOiBwb3M7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0RWRpdGFibGVQb3MoYWR2YW5jZWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzVmFsaWRDaGFyKGNoLCB0b2tlbikpIHtcbiAgICAgIHRoaXMuYnVmZmVyW3Bvc10gPSBjaDtcbiAgICAgIHJldHVybiB0aGlzLm5leHRFZGl0YWJsZVBvcyhwb3MgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnJlYWRPbmx5IHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBvcyA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG5cbiAgICAvLyBTZSBvIGN1cnNvciBjYWl1IGVtIHVtIGxpdGVyYWwsIGVtcHVycmEgcGFyYSBvIHNsb3QgZWRpdMOhdmVsIG1haXMgcHLDs3hpbW9cbiAgICBpZiAodGhpcy50b2tlbnNbcG9zXSAmJiB0aGlzLnRva2Vuc1twb3NdLnR5cGUgPT09ICdsaXRlcmFsJykge1xuICAgICAgdGhpcy5zZXRDdXJzb3IodGhpcy5uZXh0RWRpdGFibGVQb3MocG9zKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKCF0aGlzLm1hc2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0QnVmZmVyKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLnNldElucHV0VmFsdWUoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBidWZmZXJJZHggPSAwO1xuICAgIGxldCB2YWx1ZUlkeCA9IDA7XG5cbiAgICB3aGlsZSAodmFsdWVJZHggPCB2YWx1ZS5sZW5ndGggJiYgYnVmZmVySWR4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5zW2J1ZmZlcklkeF07XG4gICAgICBjb25zdCBjaGFyID0gdmFsdWVbdmFsdWVJZHhdO1xuXG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIC8vIENvbnNvbWUgbyBsaXRlcmFsIGRvIHZhbG9yIHNlIGNvcnJlc3BvbmRlcjsgc2VtcHJlIGF2YW7Dp2EgbyBidWZmZXJcbiAgICAgICAgaWYgKGNoYXIgPT09IHRva2VuLmNoYXIpIHtcbiAgICAgICAgICB2YWx1ZUlkeCsrO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcklkeCsrO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmFsaWRDaGFyKGNoYXIsIHRva2VuKSkge1xuICAgICAgICB0aGlzLmJ1ZmZlcltidWZmZXJJZHhdID0gY2hhcjtcbiAgICAgICAgYnVmZmVySWR4Kys7XG4gICAgICAgIHZhbHVlSWR4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQdWxhIGNhcmFjdGVyZXMgZG8gdmFsb3IgcXVlIG7Do28gY29ycmVzcG9uZGVtIGFvIHNsb3QgYXR1YWxcbiAgICAgICAgdmFsdWVJZHgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXREaXNwbGF5VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc01hc2tDb21wbGV0ZSgpKSB7XG4gICAgICByZXR1cm4geyBpbmNvbXBsZXRlTWFzazogeyBtYXNrOiB0aGlzLm1hc2sgfSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
|