@esfaenza/extensions 15.2.6 → 15.2.8

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.
@@ -3,48 +3,28 @@
3
3
  * utilizzato dal servizio di esportazione per prendere il valore delle proprietà di un oggetto
4
4
  */
5
5
  export const csvValueNavigator = "_csvnav";
6
- /**
7
- * Suffisso della proprietà da generare in cui salvare l'ordine di esportazione
8
- */
6
+ /** Suffisso della proprietà da generare in cui salvare l'ordine di esportazione */
9
7
  export const csvOrdPrefix = "_csvord";
10
- /**
11
- * Suffisso della proprietà da generare in cui salvare la visibilità di questa proprietà
12
- */
8
+ /** Suffisso della proprietà da generare in cui salvare la visibilità di questa proprietà */
13
9
  export const csvVisPrefix = "_csvvis";
14
- /**
15
- * Suffisso della proprietà da generare in cui salvare il nome della colonna in cui salvare questa proprietà
16
- */
10
+ /** Suffisso della proprietà da generare in cui salvare il nome della colonna in cui salvare questa proprietà */
17
11
  export const csvHdrPrefix = "_csvhdr";
18
- /**
19
- * Suffisso della proprietà da generare in cui salvare il codice del th a cui si riferisce questo campo
20
- */
12
+ /** Suffisso della proprietà da generare in cui salvare il codice del th a cui si riferisce questo campo */
21
13
  export const csvPropKey = "_csvkey";
22
- /**
23
- * Suffisso della proprietà da generare in cui salvare il valore da prendere per una proprietà di tipo Lista
24
- */
14
+ /** Suffisso della proprietà da generare in cui salvare il valore da prendere per una proprietà di tipo Lista */
25
15
  export const listCsvValPrefix = "_listcsvval";
26
- /**
27
- * Suffisso della proprietà da generare in cui salvare l'Header della proprietà di tipo Lista relativo al valore esportato nella proprietà con suffisso **listCsvValPrefix**
28
- */
16
+ /** Suffisso della proprietà da generare in cui salvare l'Header della proprietà di tipo Lista relativo al valore esportato nella proprietà con suffisso **listCsvValPrefix** */
29
17
  export const listCsvHdrPrefix = "_listcsvhdr";
30
- /**
31
- * Suffisso della proprietà da generare in cui salvare il formato della proprietà di tipo Lista relativo al valore esportato nella proprietà con suffisso **listCsvValPrefix**
32
- */
18
+ /** Suffisso della proprietà da generare in cui salvare il formato della proprietà di tipo Lista relativo al valore esportato nella proprietà con suffisso **listCsvValPrefix** */
33
19
  export const listCsvValFormat = "_listcsvvalformat";
34
- /**
35
- * Suffisso della proprietà da generare in cui salvare il valore da prendere per una proprietà di tipo Dizionario
36
- */
20
+ /** Suffisso della proprietà da generare in cui salvare il valore da prendere per una proprietà di tipo Dizionario */
37
21
  export const dictionaryCsvValPrefix = "_flatlistcsvval";
38
- /**
39
- * Suffisso della proprietà da generare in cui salvare l'Header della proprietà di un Dizionario relativo al valore esportato nella proprietà con suffisso **dictionaryCsvValPrefix**
40
- */
22
+ /** Suffisso della proprietà da generare in cui salvare l'Header della proprietà di un Dizionario relativo al valore esportato nella proprietà con suffisso **dictionaryCsvValPrefix** */
41
23
  export const dictionaryCsvHdrPrefix = "_flatlistcsvhdr";
42
- /**
43
- * Suffisso della proprietà da generare in cui salvare il formato della proprietà che si sta esportando
44
- */
24
+ /** Suffisso della proprietà da generare in cui salvare il formato della proprietà che si sta esportando */
45
25
  export const csvFormatPrefix = "_csvfmt";
46
- /**
47
- * Nome della proprietà che contiene tutti i nomi di tutte le proprietà da esportare
48
- */
26
+ /** Nome della proprietà che contiene tutti i nomi di tutte le proprietà da esportare */
49
27
  export const exportList = "__export_list__";
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwb3J0Q29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL21vZGVscy9FeHBvcnRDb25zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVcsU0FBUyxDQUFDO0FBRW5EOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFXLFNBQVMsQ0FBQztBQUU5Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBVyxTQUFTLENBQUM7QUFFOUM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsU0FBUyxDQUFDO0FBRTlDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFXLFNBQVMsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFXLGFBQWEsQ0FBQztBQUV0RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFXLGFBQWEsQ0FBQztBQUV0RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFXLG1CQUFtQixDQUFDO0FBRTVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQVcsaUJBQWlCLENBQUM7QUFFaEU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBVyxpQkFBaUIsQ0FBQztBQUVoRTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBVyxTQUFTLENBQUM7QUFFakQ7O0VBRUU7QUFDRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQVcsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBpbCBuYXZpZ2F0b3JlIFxyXG4gKiB1dGlsaXp6YXRvIGRhbCBzZXJ2aXppbyBkaSBlc3BvcnRhemlvbmUgcGVyIHByZW5kZXJlIGlsIHZhbG9yZSBkZWxsZSBwcm9wcmlldMOgIGRpIHVuIG9nZ2V0dG9cclxuICovXHJcbmV4cG9ydCBjb25zdCBjc3ZWYWx1ZU5hdmlnYXRvcjogc3RyaW5nID0gXCJfY3N2bmF2XCI7XHJcblxyXG4vKipcclxuICogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBsJ29yZGluZSBkaSBlc3BvcnRhemlvbmVcclxuICovXHJcbmV4cG9ydCBjb25zdCBjc3ZPcmRQcmVmaXg6IHN0cmluZyA9IFwiX2Nzdm9yZFwiO1xyXG5cclxuLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgbGEgdmlzaWJpbGl0w6AgZGkgcXVlc3RhIHByb3ByaWV0w6BcclxuICovXHJcbmV4cG9ydCBjb25zdCBjc3ZWaXNQcmVmaXg6IHN0cmluZyA9IFwiX2NzdnZpc1wiO1xyXG5cclxuLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgbm9tZSBkZWxsYSBjb2xvbm5hIGluIGN1aSBzYWx2YXJlIHF1ZXN0YSBwcm9wcmlldMOgXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3N2SGRyUHJlZml4OiBzdHJpbmcgPSBcIl9jc3ZoZHJcIjtcclxuXHJcbi8qKlxyXG4gKiBTdWZmaXNzbyBkZWxsYSBwcm9wcmlldMOgIGRhIGdlbmVyYXJlIGluIGN1aSBzYWx2YXJlIGlsIGNvZGljZSBkZWwgdGggYSBjdWkgc2kgcmlmZXJpc2NlIHF1ZXN0byBjYW1wb1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNzdlByb3BLZXk6IHN0cmluZyA9IFwiX2NzdmtleVwiO1xyXG5cclxuLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgdmFsb3JlIGRhIHByZW5kZXJlIHBlciB1bmEgcHJvcHJpZXTDoCBkaSB0aXBvIExpc3RhXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbGlzdENzdlZhbFByZWZpeDogc3RyaW5nID0gXCJfbGlzdGNzdnZhbFwiO1xyXG5cclxuLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgbCdIZWFkZXIgZGVsbGEgcHJvcHJpZXTDoCBkaSB0aXBvIExpc3RhIHJlbGF0aXZvIGFsIHZhbG9yZSBlc3BvcnRhdG8gbmVsbGEgcHJvcHJpZXTDoCBjb24gc3VmZmlzc28gKipsaXN0Q3N2VmFsUHJlZml4KipcclxuICovXHJcbmV4cG9ydCBjb25zdCBsaXN0Q3N2SGRyUHJlZml4OiBzdHJpbmcgPSBcIl9saXN0Y3N2aGRyXCI7XHJcblxyXG4vKipcclxuICogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBpbCBmb3JtYXRvIGRlbGxhIHByb3ByaWV0w6AgZGkgdGlwbyBMaXN0YSByZWxhdGl2byBhbCB2YWxvcmUgZXNwb3J0YXRvIG5lbGxhIHByb3ByaWV0w6AgY29uIHN1ZmZpc3NvICoqbGlzdENzdlZhbFByZWZpeCoqXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbGlzdENzdlZhbEZvcm1hdDogc3RyaW5nID0gXCJfbGlzdGNzdnZhbGZvcm1hdFwiO1xyXG5cclxuLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgdmFsb3JlIGRhIHByZW5kZXJlIHBlciB1bmEgcHJvcHJpZXTDoCBkaSB0aXBvIERpemlvbmFyaW9cclxuICovXHJcbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4OiBzdHJpbmcgPSBcIl9mbGF0bGlzdGNzdnZhbFwiO1xyXG5cclxuLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgbCdIZWFkZXIgZGVsbGEgcHJvcHJpZXTDoCBkaSB1biBEaXppb25hcmlvIHJlbGF0aXZvIGFsIHZhbG9yZSBlc3BvcnRhdG8gbmVsbGEgcHJvcHJpZXTDoCBjb24gc3VmZmlzc28gKipkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4KipcclxuICovXHJcbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4OiBzdHJpbmcgPSBcIl9mbGF0bGlzdGNzdmhkclwiO1xyXG5cclxuLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgZm9ybWF0byBkZWxsYSBwcm9wcmlldMOgIGNoZSBzaSBzdGEgZXNwb3J0YW5kb1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNzdkZvcm1hdFByZWZpeDogc3RyaW5nID0gXCJfY3N2Zm10XCI7XHJcblxyXG4vKipcclxuKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIHR1dHRpIGkgbm9taSBkaSB0dXR0ZSBsZSBwcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4qL1xyXG5leHBvcnQgY29uc3QgZXhwb3J0TGlzdDogc3RyaW5nID0gXCJfX2V4cG9ydF9saXN0X19cIjsiXX0=
28
+ /** Nome della proprietà che contiene la classe di localizzazione da utilizzare per una data esportazione */
29
+ export const locProperty = "__loc__";
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwb3J0Q29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL21vZGVscy9FeHBvcnRDb25zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVcsU0FBUyxDQUFDO0FBRW5ELG1GQUFtRjtBQUNuRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsU0FBUyxDQUFDO0FBQzlDLDRGQUE0RjtBQUM1RixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsU0FBUyxDQUFDO0FBQzlDLGdIQUFnSDtBQUNoSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsU0FBUyxDQUFDO0FBQzlDLDJHQUEyRztBQUMzRyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQVcsU0FBUyxDQUFDO0FBQzVDLGdIQUFnSDtBQUNoSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBVyxhQUFhLENBQUM7QUFDdEQsZ0xBQWdMO0FBQ2hMLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFXLGFBQWEsQ0FBQztBQUN0RCxrTEFBa0w7QUFDbEwsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQVcsbUJBQW1CLENBQUM7QUFDNUQscUhBQXFIO0FBQ3JILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFXLGlCQUFpQixDQUFDO0FBQ2hFLHlMQUF5TDtBQUN6TCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBVyxpQkFBaUIsQ0FBQztBQUNoRSwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFXLFNBQVMsQ0FBQztBQUNqRCx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFXLGlCQUFpQixDQUFDO0FBQ3BELDRHQUE0RztBQUM1RyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQVcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgbmF2aWdhdG9yZSBcclxuICogdXRpbGl6emF0byBkYWwgc2Vydml6aW8gZGkgZXNwb3J0YXppb25lIHBlciBwcmVuZGVyZSBpbCB2YWxvcmUgZGVsbGUgcHJvcHJpZXTDoCBkaSB1biBvZ2dldHRvXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3N2VmFsdWVOYXZpZ2F0b3I6IHN0cmluZyA9IFwiX2Nzdm5hdlwiO1xyXG5cclxuLyoqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgbCdvcmRpbmUgZGkgZXNwb3J0YXppb25lICovXHJcbmV4cG9ydCBjb25zdCBjc3ZPcmRQcmVmaXg6IHN0cmluZyA9IFwiX2Nzdm9yZFwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBsYSB2aXNpYmlsaXTDoCBkaSBxdWVzdGEgcHJvcHJpZXTDoCAqL1xyXG5leHBvcnQgY29uc3QgY3N2VmlzUHJlZml4OiBzdHJpbmcgPSBcIl9jc3Z2aXNcIjtcclxuLyoqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgbm9tZSBkZWxsYSBjb2xvbm5hIGluIGN1aSBzYWx2YXJlIHF1ZXN0YSBwcm9wcmlldMOgICovXHJcbmV4cG9ydCBjb25zdCBjc3ZIZHJQcmVmaXg6IHN0cmluZyA9IFwiX2NzdmhkclwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBpbCBjb2RpY2UgZGVsIHRoIGEgY3VpIHNpIHJpZmVyaXNjZSBxdWVzdG8gY2FtcG8gKi9cclxuZXhwb3J0IGNvbnN0IGNzdlByb3BLZXk6IHN0cmluZyA9IFwiX2NzdmtleVwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBpbCB2YWxvcmUgZGEgcHJlbmRlcmUgcGVyIHVuYSBwcm9wcmlldMOgIGRpIHRpcG8gTGlzdGEgKi9cclxuZXhwb3J0IGNvbnN0IGxpc3RDc3ZWYWxQcmVmaXg6IHN0cmluZyA9IFwiX2xpc3Rjc3Z2YWxcIjtcclxuLyoqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgbCdIZWFkZXIgZGVsbGEgcHJvcHJpZXTDoCBkaSB0aXBvIExpc3RhIHJlbGF0aXZvIGFsIHZhbG9yZSBlc3BvcnRhdG8gbmVsbGEgcHJvcHJpZXTDoCBjb24gc3VmZmlzc28gKipsaXN0Q3N2VmFsUHJlZml4KiogKi9cclxuZXhwb3J0IGNvbnN0IGxpc3RDc3ZIZHJQcmVmaXg6IHN0cmluZyA9IFwiX2xpc3Rjc3ZoZHJcIjtcclxuLyoqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgZm9ybWF0byBkZWxsYSBwcm9wcmlldMOgIGRpIHRpcG8gTGlzdGEgcmVsYXRpdm8gYWwgdmFsb3JlIGVzcG9ydGF0byBuZWxsYSBwcm9wcmlldMOgIGNvbiBzdWZmaXNzbyAqKmxpc3RDc3ZWYWxQcmVmaXgqKiAqL1xyXG5leHBvcnQgY29uc3QgbGlzdENzdlZhbEZvcm1hdDogc3RyaW5nID0gXCJfbGlzdGNzdnZhbGZvcm1hdFwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBpbCB2YWxvcmUgZGEgcHJlbmRlcmUgcGVyIHVuYSBwcm9wcmlldMOgIGRpIHRpcG8gRGl6aW9uYXJpbyAqL1xyXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeUNzdlZhbFByZWZpeDogc3RyaW5nID0gXCJfZmxhdGxpc3Rjc3Z2YWxcIjtcclxuLyoqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgbCdIZWFkZXIgZGVsbGEgcHJvcHJpZXTDoCBkaSB1biBEaXppb25hcmlvIHJlbGF0aXZvIGFsIHZhbG9yZSBlc3BvcnRhdG8gbmVsbGEgcHJvcHJpZXTDoCBjb24gc3VmZmlzc28gKipkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4KiogKi9cclxuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXg6IHN0cmluZyA9IFwiX2ZsYXRsaXN0Y3N2aGRyXCI7XHJcbi8qKiBTdWZmaXNzbyBkZWxsYSBwcm9wcmlldMOgIGRhIGdlbmVyYXJlIGluIGN1aSBzYWx2YXJlIGlsIGZvcm1hdG8gZGVsbGEgcHJvcHJpZXTDoCBjaGUgc2kgc3RhIGVzcG9ydGFuZG8gKi9cclxuZXhwb3J0IGNvbnN0IGNzdkZvcm1hdFByZWZpeDogc3RyaW5nID0gXCJfY3N2Zm10XCI7XHJcbi8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIHR1dHRpIGkgbm9taSBkaSB0dXR0ZSBsZSBwcm9wcmlldMOgIGRhIGVzcG9ydGFyZSAqL1xyXG5leHBvcnQgY29uc3QgZXhwb3J0TGlzdDogc3RyaW5nID0gXCJfX2V4cG9ydF9saXN0X19cIjtcclxuLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbGEgY2xhc3NlIGRpIGxvY2FsaXp6YXppb25lIGRhIHV0aWxpenphcmUgcGVyIHVuYSBkYXRhIGVzcG9ydGF6aW9uZSAqL1xyXG5leHBvcnQgY29uc3QgbG9jUHJvcGVydHk6IHN0cmluZyA9IFwiX19sb2NfX1wiOyJdfQ==
@@ -1,11 +1,30 @@
1
1
  // Angular
2
- import { Injectable } from "@angular/core";
2
+ import { Injectable, Injector } from "@angular/core";
3
3
  // Libs
4
4
  import { Deserialize } from "cerialize";
5
+ // Esfaenza
6
+ import { LocalizationService } from "@esfaenza/localizations";
5
7
  // Configurazioni
6
- import { exportList, csvFormatPrefix, csvHdrPrefix, csvOrdPrefix, csvValueNavigator, csvVisPrefix, dictionaryCsvHdrPrefix, dictionaryCsvValPrefix, listCsvHdrPrefix, listCsvValFormat, listCsvValPrefix, csvPropKey } from "../models/ExportConsts";
8
+ import { exportList, csvFormatPrefix, csvHdrPrefix, csvOrdPrefix, csvValueNavigator, csvVisPrefix, dictionaryCsvHdrPrefix, dictionaryCsvValPrefix, listCsvHdrPrefix, listCsvValFormat, listCsvValPrefix, csvPropKey, locProperty } from "../models/ExportConsts";
7
9
  import * as i0 from "@angular/core";
8
10
  import * as i1 from "./extensions.dates.service";
11
+ /**
12
+ * Decoratore che fornisce la classe di localizzazione per tutte le proprietà esportate con @Export e qualsiasi altro tag che richieda localizzazioni.
13
+ *
14
+ * Sostanzilamente aggiunge la proprietà **__loc__** all'oggetto creato dalla classe corrente assegnandogli come valore il tipo del LocalizationService da usare per la traduzione
15
+ *
16
+ * @param {Type<LocalizationService>} loc Tipo ereditato dal LocalizationService che può essere creato a runtime sotto contesto della DI di Angular
17
+ */
18
+ export function ExportLocalization(loc) {
19
+ return function integrateLoc(constructor) {
20
+ return class extends constructor {
21
+ constructor() {
22
+ super(...arguments);
23
+ this.__loc__ = loc;
24
+ }
25
+ };
26
+ };
27
+ }
9
28
  /**
10
29
  * Decoratore di esportazione utilizzabile su una proprietà singola.
11
30
  * Verranno generate 3 proprietà che gestiranno l'esportazione: (prop, prop_csvvis, prop_csvhdr).
@@ -266,6 +285,7 @@ export class ExportService {
266
285
  var headers = [];
267
286
  // Miracle incoming
268
287
  let exportProps = obj[exportList] || [];
288
+ let loc = this.getLocalizationService(obj);
269
289
  if (exportProps.length == 0)
270
290
  console.warn("[@esfaenza/extensions] Nessuna colonna configurata da esportare!");
271
291
  for (let i = 0; i < exportProps.length; i++) {
@@ -277,8 +297,8 @@ export class ExportService {
277
297
  toCall = this.parseList.bind(this);
278
298
  }
279
299
  else if (prop.endsWith(dictionaryCsvHdrPrefix)) {
280
- toCall = this.parseDictionary.bind(this);
281
300
  propBase = prop.replace(dictionaryCsvHdrPrefix, '');
301
+ toCall = this.parseDictionary.bind(this);
282
302
  }
283
303
  else if (prop.endsWith(csvVisPrefix)) {
284
304
  propBase = prop.replace(csvVisPrefix, '');
@@ -288,10 +308,17 @@ export class ExportService {
288
308
  toCall = this.parseProperty.bind(this);
289
309
  }
290
310
  if (toCall)
291
- toCall(obj, propBase, headers, columnsSelection);
311
+ toCall(obj, propBase, headers, columnsSelection, loc);
292
312
  }
293
313
  return headers;
294
314
  }
315
+ /** Helper per ottenere il servizio di localizzazione relativo ad un'entità */
316
+ getLocalizationService(object) {
317
+ if (!object[locProperty])
318
+ return null;
319
+ const injector = Injector.create({ providers: [{ provide: LocalizationService, useClass: object[locProperty] }] });
320
+ return injector.get(LocalizationService);
321
+ }
295
322
  /**
296
323
  * Setup per l'esportazione di una singola proprietà.
297
324
  * Viene generato l'header e la proprietà relativa al valore formattato o no
@@ -299,8 +326,9 @@ export class ExportService {
299
326
  * @param {any} obj Oggetto di cui esportare la proprietà **prop**
300
327
  * @param {string} prop Proprietà da esportare
301
328
  * @param {CsvHeaders} headers Contenitore degli header, verrà riempito da questa funzione
329
+ * @param {LocalizationService} loc Servizio di localizzazione che traduce tutti i nomi che può
302
330
  */
303
- parseProperty(obj, prop, headers, columnsSelection) {
331
+ parseProperty(obj, prop, headers, columnsSelection, loc) {
304
332
  let toEmit = obj[prop + csvVisPrefix];
305
333
  let format = obj[prop + csvFormatPrefix];
306
334
  let propKey = obj[prop + csvPropKey];
@@ -308,36 +336,39 @@ export class ExportService {
308
336
  console.log("[@esfaenza/extensions] Colonna da non esportare: " + propKey);
309
337
  return;
310
338
  }
311
- let lbl = obj[prop + csvHdrPrefix];
339
+ let text = obj[prop + csvHdrPrefix];
340
+ let label = loc && text ? loc.loc(text) : text || "";
312
341
  let order = obj[prop + csvOrdPrefix];
313
- if (toEmit && lbl !== "undefined") {
314
- // Se non ho un formato esporto direttamente
315
- if (!format) {
316
- // Se è un formato data mi assicuro di non stampare mai una data 00:00:00 altrimenti in esportazione viene uno schifo
317
- var val = obj[prop] ? this.dates.trimSeconds(obj[prop].toString()) : "";
318
- Object.defineProperty(obj, prop + "_nofmt", { value: val, writable: false, enumerable: true });
319
- headers.push({ label: lbl ? lbl : prop + "_nofmt", key: prop + "_nofmt", order: order, type: "string", propKey: propKey });
342
+ if (!toEmit)
343
+ return;
344
+ // Se non ho un formato esporto direttamente
345
+ if (!format) {
346
+ // Se è un formato data mi assicuro di non stampare mai una data 00:00:00 altrimenti in esportazione viene uno schifo
347
+ let val = obj[prop] ? this.dates.trimSeconds(obj[prop].toString()) : "";
348
+ let key = prop + "_nofmt";
349
+ Object.defineProperty(obj, key, { value: val, writable: false, enumerable: true });
350
+ headers.push({ label, key, order, type: "string", propKey });
351
+ }
352
+ else {
353
+ let key = prop + "_fmt";
354
+ // Caso formato numerico
355
+ if (format == "F") {
356
+ // Check considerando la possibilità di zeri
357
+ let val = obj[prop] != null ? obj[prop].toString() : "";
358
+ // Elimino tutte le virgole (indicatori di migliaia per la culture default en-US)
359
+ val = val.replace(/,/, "");
360
+ // Il singolo punto che c'è, se presente (separatore decimali) lo trasformo in virgola
361
+ let valConverted = val.replace(".", ",");
362
+ Object.defineProperty(obj, key, { value: valConverted, writable: false, enumerable: true });
363
+ headers.push({ label, key, order, type: "number", propKey });
320
364
  }
321
365
  else {
322
- // Caso formato numerico
323
- if (format == "F") {
324
- // Check considerando la possibilità di zeri
325
- let val = obj[prop] != null ? obj[prop].toString() : "";
326
- // Elimino tutte le virgole (indicatori di migliaia per la culture default en-US)
327
- val = val.replace(/,/, "");
328
- // Il singolo punto che c'è, se presente (separatore decimali) lo trasformo in virgola
329
- let valConverted = val.replace(".", ",");
330
- Object.defineProperty(obj, prop + "_fmt", { value: valConverted, writable: false, enumerable: true });
331
- headers.push({ label: lbl ? lbl : prop + "_fmt", key: prop + "_fmt", order: order, type: "number", propKey: propKey });
332
- }
333
- else {
334
- // Se ho un formato data trasformo in dayjs, formatto ed esporto
335
- // Per la trasformazione in dayjs provo prima a passargli la stringa di netto, sperando la riconosca
336
- // Se non funziona provo a definirgli la formattazione standard del metering per quel linguaggio
337
- let val = this.dates.getFormatted(obj[prop], format.length <= 10, format.length > 16);
338
- Object.defineProperty(obj, prop + "_fmt", { value: val ?? "", writable: false, enumerable: true });
339
- headers.push({ label: lbl ? lbl : prop + "_fmt", key: prop + "_fmt", order: order, type: "date", propKey: propKey });
340
- }
366
+ // Se ho un formato data trasformo in dayjs, formatto ed esporto
367
+ // Per la trasformazione in dayjs provo prima a passargli la stringa di netto, sperando la riconosca
368
+ // Se non funziona provo a definirgli la formattazione standard del metering per quel linguaggio
369
+ let val = this.dates.getFormatted(obj[prop], format.length <= 10, format.length > 16);
370
+ Object.defineProperty(obj, key, { value: val ?? "", writable: false, enumerable: true });
371
+ headers.push({ label, key, order, type: "date", propKey });
341
372
  }
342
373
  }
343
374
  }
@@ -350,8 +381,9 @@ export class ExportService {
350
381
  * @param {any} obj Oggetto di cui esportare la proprietà **prop**
351
382
  * @param {string} prop Proprietà da esportare
352
383
  * @param {CsvHeaders} headers Contenitore degli header, verrà riempito da questa funzione
384
+ * @param {LocalizationService} loc Servizio di localizzazione che traduce tutti i nomi che può
353
385
  */
354
- parseObject(obj, prop, headers) {
386
+ parseObject(obj, prop, headers, loc) {
355
387
  //se questa proprietà ha un navigator significa che deriva da un oggetto interno, recupero il valore in questa fase dato che prima non ce l'ho
356
388
  let valuenavigator = obj[prop + csvValueNavigator];
357
389
  //Es. di valuenavigator obj.subobj.subsubobj.property
@@ -365,7 +397,8 @@ export class ExportService {
365
397
  jmps.forEach(pp => { clone = clone[pp]; });
366
398
  //Valore finale :D
367
399
  let value = clone;
368
- let lbl = obj[prop + csvHdrPrefix];
400
+ let text = obj[prop + csvHdrPrefix];
401
+ let label = loc && text ? loc.loc(text) : text || "";
369
402
  let order = obj[prop + csvOrdPrefix];
370
403
  //Se per questa proprietà ho un formato lo applico
371
404
  let format = obj[prop + csvFormatPrefix];
@@ -381,7 +414,7 @@ export class ExportService {
381
414
  type = "date";
382
415
  }
383
416
  Object.defineProperty(obj, prop, { value: value ?? "", writable: false, enumerable: true });
384
- headers.push({ label: lbl ? lbl : prop, key: prop, order: order, type: type, propKey: null });
417
+ headers.push({ label, key: prop, order, type, propKey: null });
385
418
  }
386
419
  /**
387
420
  * Setup per l'esportazione di una lista di valori pivottati dinamicamente:
@@ -397,8 +430,9 @@ export class ExportService {
397
430
  * @param {any} obj Oggetto di cui esportare la proprietà **prop**
398
431
  * @param {string} prop Proprietà da esportare
399
432
  * @param {CsvHeaders} headers Contenitore degli header, verrà riempito da questa funzione
433
+ * @param {LocalizationService} loc Servizio di localizzazione che traduce tutti i nomi che può
400
434
  */
401
- parseList(obj, prop, headers) {
435
+ parseList(obj, prop, headers, loc) {
402
436
  let headernavigator = obj[prop + listCsvHdrPrefix];
403
437
  let valuenavigator = obj[prop + listCsvValPrefix];
404
438
  let valueformat = obj[prop + listCsvValFormat];
@@ -408,16 +442,16 @@ export class ExportService {
408
442
  for (let idx = 0; idx < objs.length; idx++) {
409
443
  let listitem = objs[idx];
410
444
  var headersplit = headernavigator.split(" ");
411
- var header = "";
445
+ var label = "";
412
446
  // Per l'header si considera a se stante ogni pezzo separato da spazio per fare le concatenazioni
413
447
  headersplit.forEach(pr => {
414
448
  jumps = pr.split(".");
415
449
  tmpRes = JSON.parse(JSON.stringify(listitem));
416
450
  jumps.forEach(pp => { tmpRes = tmpRes[pp]; });
417
- if (!header)
418
- header = tmpRes;
451
+ if (!label)
452
+ label = !!loc ? loc.loc(tmpRes) : tmpRes;
419
453
  else
420
- header += " " + tmpRes;
454
+ label += " " + !!loc ? loc.loc(tmpRes) : tmpRes;
421
455
  });
422
456
  jumps = valuenavigator.split(".");
423
457
  tmpRes = JSON.parse(JSON.stringify(listitem));
@@ -435,7 +469,7 @@ export class ExportService {
435
469
  type = "date";
436
470
  }
437
471
  Object.defineProperty(obj, prop + idx, { value: value ?? "", writable: false });
438
- headers.push({ label: header, key: prop + idx, order: order + idx, type: type, propKey: null });
472
+ headers.push({ label, key: prop + idx, order: order + idx, type, propKey: null });
439
473
  }
440
474
  }
441
475
  /**
@@ -452,8 +486,9 @@ export class ExportService {
452
486
  * @param {any} obj Oggetto di cui esportare la proprietà **prop**
453
487
  * @param {string} prop Proprietà da esportare
454
488
  * @param {CsvHeaders} headers Contenitore degli header, verrà riempito da questa funzione
489
+ * @param {LocalizationService} loc Servizio di localizzazione che traduce tutti i nomi che può
455
490
  */
456
- parseDictionary(obj, prop, headers) {
491
+ parseDictionary(obj, prop, headers, loc) {
457
492
  let headernavigator = obj[prop + dictionaryCsvHdrPrefix];
458
493
  let valuenavigator = obj[prop + dictionaryCsvValPrefix];
459
494
  let order = obj[prop + csvOrdPrefix];
@@ -462,15 +497,15 @@ export class ExportService {
462
497
  for (let idx = 0; idx < objs.length; idx++) {
463
498
  let listitem = objs[idx];
464
499
  var headersplit = headernavigator.split(" ");
465
- var header = "";
500
+ var label = "";
466
501
  headersplit.forEach(pr => {
467
502
  jumps = pr.split(".");
468
503
  tmpRes = JSON.parse(JSON.stringify(listitem));
469
504
  jumps.forEach(pp => { tmpRes = tmpRes[pp]; });
470
- if (!header)
471
- header = tmpRes;
505
+ if (!label)
506
+ label = !!loc ? loc.loc(tmpRes) : tmpRes;
472
507
  else
473
- header += " " + tmpRes;
508
+ label += " " + !!loc ? loc.loc(tmpRes) : tmpRes;
474
509
  });
475
510
  var valuesplit = valuenavigator.split(",");
476
511
  valuesplit.forEach((t, idxinternal) => {
@@ -482,7 +517,7 @@ export class ExportService {
482
517
  let value = tmpRes;
483
518
  let propname = prop + idx.toString() + idxinternal.toString();
484
519
  Object.defineProperty(obj, propname, { value: value ?? "", writable: false });
485
- headers.push({ label: header + " " + desc, key: propname, order: order + idx, type: 'string', propKey: null });
520
+ headers.push({ label: label + " " + !!loc ? loc.loc(desc) : desc, key: propname, order: order + idx, type: 'string', propKey: null });
486
521
  });
487
522
  }
488
523
  }
@@ -505,4 +540,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
505
540
  type: Injectable,
506
541
  args: [{ providedIn: "root" }]
507
542
  }], ctorParameters: function () { return [{ type: i1.DateService }]; } });
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTztBQUNQLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEMsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFPcFA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsU0FBaUIsSUFBSSxFQUFFLFVBQWtCLElBQUksRUFBRSxFQUFFLENBQ3JHLENBQUMsTUFBYyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtJQUN0QyxJQUFJLE1BQU07UUFDUixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3RixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0s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QUVEOzs7Ozs7OztPQVFHO0lBQ0ksb0JBQW9CLENBQUMsS0FBWSxFQUFFLElBQVM7UUFDakQsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7OzBHQTlYVSxhQUFhOzhHQUFiLGFBQWEsY0FERCxNQUFNOzJGQUNsQixhQUFhO2tCQUR6QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBMaWJzXHJcbmltcG9ydCB7IERlc2VyaWFsaXplIH0gZnJvbSBcImNlcmlhbGl6ZVwiO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuXHJcbmltcG9ydCB7IGV4cG9ydExpc3QsIGNzdkZvcm1hdFByZWZpeCwgY3N2SGRyUHJlZml4LCBjc3ZPcmRQcmVmaXgsIGNzdlZhbHVlTmF2aWdhdG9yLCBjc3ZWaXNQcmVmaXgsIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXgsIGxpc3RDc3ZIZHJQcmVmaXgsIGxpc3RDc3ZWYWxGb3JtYXQsIGxpc3RDc3ZWYWxQcmVmaXgsIGNzdlByb3BLZXkgfSBmcm9tIFwiLi4vbW9kZWxzL0V4cG9ydENvbnN0c1wiO1xyXG5pbXBvcnQgeyBEYXRlU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy5kYXRlcy5zZXJ2aWNlJztcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQ3N2SGVhZGVycyB9IGZyb20gXCIuLi9tb2RlbHMvQ3N2SGVhZGVyc1wiO1xyXG5pbXBvcnQgeyBHZW5lcmljSXRlbSB9IGZyb20gXCIuLi9tb2RlbHMvR2VuZXJpY0l0ZW1cIjtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIHByb3ByaWV0w6Agc2luZ29sYS4gXHJcbiAqIFZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIGNpYW86IHN0cmluZztcclxuICogY2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCJcclxuICogYGBgXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXIgVGl0b2xvIGRlbGxhIGNvbG9ubmEgbmVsIGZpbGUgQ1NWIGVzcG9ydGF0b1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IEZvcm1hdG8gZGkgZXNwb3J0YXppb25lLiBQdcOyIGVzc2VyZSB1biBmb3JtYXRvIGRhdGEgcGVyIGkgY2FtcGkgZGF0YSBvICdGJyBwZXIgaSBjYW1waSBmbG9hdGluZyBwb2ludFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXI6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSBudWxsLCB0YWJsZWlkOiBzdHJpbmcgPSBudWxsKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGZvcm1hdClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogISFoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIGlmKHRhYmxlaWQpXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2UHJvcEtleSwgeyB2YWx1ZTogdGFibGVpZCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XS5wdXNoKHByb3BlcnR5S2V5ICsgY3N2VmlzUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgY3N2VmlzUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIG9nZ2V0dG8uIFxyXG4gKiBQZXIgb2duaSBwcm9wcmlldMOgIGRlbGwnb2dnZXR0byB2ZXJyYW5ubyBnZW5lcmF0ZSAzIHByb3ByaWV0w6AgY2hlIGdlc3RpcmFubm8gbCdlc3BvcnRhemlvbmU6IChwcm9wLCBwcm9wX2NzdnZpcywgcHJvcF9jc3ZoZHIpLiBcclxuICogUGVyIGVzc2VyZSBlc3BvcnRhdGUsIGxlIHByb3ByaWV0w6AgZGVsbCdvZ2dldHRvIGRldm9ubyBlc3NlcmUgbWFyY2F0ZSBjb24gaSBEZWNvcmF0b3JpIGRpIGVzcG9ydGF6aW9uZVxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIE15T2JqIHtcclxuICogICAgIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiAgICAgY2lhbzogc3RyaW5nO1xyXG4gKiB9XHJcbiAqIFxyXG4gKiBARXhwb3J0T2JqZWN0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogdGVzdDogTXlPYmo7IFxyXG4gKiBgYGBcclxuICogXHJcbiAqIE5hc2NlcmFubm8gbGUgc2VndWVudGkgcHJvcHJpZXTDoCBuZWxsJ29nZ2V0dG8gZXNwb3J0YWJpbGU6XHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogdGVzdGNpYW86IHN0cmluZzsgPT4gVmFsb3JlIGRpIE15T2JqLmNpYW9cclxuICogdGVzdGNpYW9fY3N2dmlzOiBzdHJpbmc7ID0+IHRydWVcclxuICogdGVzdGNpYW9fY3N2aGRyOiBzdHJpbmcgPT4gXCJNeUhlYWRlclwiIFxyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge2FueX0gdHlwZSBUaXBvIGRhIGVzcG9ydGFyZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydEFzID0gKG9yZGVyOiBudW1iZXIsIHR5cGU6IGFueSwgcHJlZml4Pzogc3RyaW5nKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgdmFyIHQgPSBuZXcgdHlwZSgpO1xyXG4gICAgdmFyIHByb3BzID0gdFtleHBvcnRMaXN0XTtcclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgIGxldCBwcm9wID0gcHJvcHNbaV0ucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgaWYgKHR5cGVvZiB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdmFyIHRvRW1pdDogYm9vbGVhbiA9IHRbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICAgICAgdmFyIGxibCA9IHRbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICAgICAgdmFyIG9yZGVyUHJvcCA9IHRbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcbiAgICAgICAgaWYgKGZvcm1hdClcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkZvcm1hdFByZWZpeCwgeyB2YWx1ZTogZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXJQcm9wICsgb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yLCB7IHZhbHVlOiBwcm9wZXJ0eUtleSArIFwiLlwiICsgcHJvcCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogdG9FbWl0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiAocHJlZml4ID8gcHJlZml4ICsgJyAnIDogJycpICsgbGJsLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXhdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1bmEgbGlzdGEsIFxyXG4gKiBzaSB1dGlsaXp6YW5vIDIgbmF2aWdhdG9yIHJpc3BldHRpdmFtZW50ZSBwZXIgbGEgdmFsb3JpenphemlvbmUgZGVsbCdIZWFkZXIgZSBkZWwgVmFsb3JlIGUgXHJcbiAqIHBlciBvZ25pIGVsZW1lbnRvIGRlbGwnYXJyYXkgdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKVxyXG4gKiBcclxuICogQVRURU5aSU9ORTogR2xpIG9nZ2V0dGkgZXNwb3J0YXRpIGluIHF1ZXN0YSBtb2RhbGl0w6Agbm9uIGRldm9ubyBwcmVzZW50YXJlIGFsdHJpIHRhZyBkaSB0aXBvIEBFeHBvcnR7Li4ufSBhbGwnaW50ZXJuby4gRmEgdHV0dG8gcXVlc3RvIGRlY29yYXRvcmVcclxuICogXHJcbiAqIEkgbmF2aWdhdG9yIGhhbm5vIHF1ZXN0YSBjb252ZW56aW9uZTpcclxuICogXHJcbiAqIC4gLS0+IGRpdmlkZSBkdWUgcHJvcHJpZXTDoCBkYSByaWNoaWFtYXJlIGNvbnNlY3V0aXZhbWVudGU6IFwiYS5iXCIgcmljaGlhbWVyw6AgXCJvYmouYS5iXCI7XHJcbiAqIFxyXG4gKiB8IC0tPiBkaXZpZGUgcGnDuSBwcm9wcmlldMOgIHBlciBsZSBjb25jYXRlbmF6aW9uaSBjb24gdW5vIHNwYXppbyBmcmEgdW5hIGUgbCdhbHRyYTogXCJyZWdkZXNjfHNsaWNlLnNsaWNlbmFtZVwiIGRpdmVudGVyw6Agb2JqLnJlZ2Rlc2MgKyBcIiBcIiArIG9iai5zbGljZS5zbGljZW5hbWVcclxuICogXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcm5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdGl0b2xvIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZW5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdmFsb3JlIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZWZvcm1hdCBGb3JtYXRvIGRpIGVzcG9ydGF6aW9uZSBwZXIgaSB2YWxvcmkgc2VsZXppb25hdGkgZGFsICoqdmFsdWVuYXZpZ2F0b3IqKi4gUHXDsiBlc3NlcmUgdW4gZm9ybWF0byBkYXRhIHBlciBpIGNhbXBpIGRhdGEgbyAnRicgcGVyIGkgY2FtcGkgZmxvYXRpbmcgcG9pbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRMaXN0ID0gKG9yZGVyOiBudW1iZXIsIGhlYWRlcm5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZW5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZWZvcm1hdDogc3RyaW5nID0gbnVsbCkgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2T3JkUHJlZml4LCB7IHZhbHVlOiBvcmRlciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2VmFsUHJlZml4LCB7IHZhbHVlOiB2YWx1ZW5hdmlnYXRvciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXJuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbEZvcm1hdCwgeyB2YWx1ZTogdmFsdWVmb3JtYXQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGxpc3RDc3ZIZHJQcmVmaXgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIGRpemlvbmFyaW8uIFNlIGFkIGVzZW1waW8gc2kgdm9nbGlvbm8gZ2VuZXJhcmUgbGUgY29sb25uZVxyXG4gKiBcclxuICogVmFsb3JlIEEgPSAxXHJcbiAqIFxyXG4gKiBWYWxvcmUgQiA9IDJcclxuICogXHJcbiAqIFZhbG9yZSBDID0gM1xyXG4gKiBcclxuICogcGFydGVuZG8gZGEgdW4gb2dnZXR0byBpbml6aWFsZSB7IFZhbG9yZSB7IEE6IDEsIEI6IDIsIEM6IDMgfSB9XHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydERpY3Rpb25hcnkgPSAob3JkZXI6IG51bWJlciwgaGVhZGVybmF2aWdhdG9yOiBzdHJpbmcsIHZhbHVlbmF2aWdhdG9yOiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIHNpIG9jY3VwYSBkZWxsJ2VzcG9ydGF6aW9uZSBkZWdsaSBvZ2dldHRpIG1hcmNhdGkgZGFpIERlY29yYXRvcmkgKipFeHBvcnREaWN0aW9uYXJ5KiosICoqRXhwb3J0TGlzdCoqLCAqKkV4cG9ydEFzKiogbyAqKkV4cG9ydCoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogXCJyb290XCJ9KVxyXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvc3RydXR0b3JlXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVzOiBEYXRlU2VydmljZSkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueVtdfSBvYmpzIE9nZ2V0dGkgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0dXBGb3JFeHBvcnQob2JqczogYW55W10sIGNvbHVtbnM6IHN0cmluZ1tdID0gW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgbGV0IGhlYWRlcnNDYWNoZSA9IHt9O1xyXG5cclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICAvLyBHbGkgaGVhZGVyIGxpIHJhY2NvbGdvIHR1dHRpIHBvaSBmYWNjaW8gdWFuIGRpc3RpbmN0IGluIG1vZG8gZGEgZXNwb3J0YXJlIHR1dHRlIGxlIHByb3ByaWV0w6AgcGVyIGJlbmVcclxuICAgIGxldCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9ID0ge307XHJcblxyXG4gICAgaWYgKGNvbHVtbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucz8ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgY29sdW1uU2VsZWN0aW9uRGljdGlvbmFyeVtjb2x1bW5zW2ldXSA9IHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoZHMgPSB0aGlzLnBhcnNlQW5kR2V0SGVhZGVycyhvYmpzW2ldLCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5KTtcclxuICAgICAgLy8gQWdnaXVuZ28gZ2xpIGhlYWRlciBmYWNlbmRvIGluIG1vZG8gZGkgbm9uIGFnZ2l1bmdlcm5lIG1haSBkdWUgdWd1YWxpIHBlciBub24gZG92ZXIgZmFyZSB1bmEgZGlzdGluY3QgZG9wb1xyXG4gICAgICAvLyBjaGUgY29zdGVyZWJiZSBjb211bnF1ZSByaXNvcnNlLiBVdGlsaXp6byB1biBkaXppb25hcmlvIGQnYXBwb2dnaW8gcGVyIGxvb2t1cCBpc3RhbnRhbmVpXHJcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzQ2FjaGVbaGRzW2tdLmtleV0pIHtcclxuICAgICAgICAgIGhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSA9IHRydWU7XHJcbiAgICAgICAgICBoZWFkZXJzLnB1c2goaGRzW2tdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT0gMClcclxuICAgICAgcmV0dXJuIGhlYWRlcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFNlIG1pIGFycml2YSBsYSBsaXN0YSBkaSBjb2xvbm5lIG5vbiBtaSBkw6Agc29sbyBsYSB2aXNpYmlsaXTDoCwgbWEgYW5jaGUgbCdvcmRpbmFtZW50b1xyXG4gICAgICAvLyBsZSBlc3BvcnRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICAgIGxldCBvcmRlcmVkSGVhZGVycyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgdGhpc0lkID0gY29sdW1uc1tpXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWFkZXJzW2ldLnByb3BLZXkgPT0gdGhpc0lkKSB7XHJcbiAgICAgICAgICAgIG9yZGVyZWRIZWFkZXJzLnB1c2goaGVhZGVyc1tpXSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3JkZXJlZEhlYWRlcnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIHVuYSBsaXN0YSBkaSBvZ2dldHRpIGdlbmVyaWNpIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGludGVncmEgb2duaSBvZ2dldHRvIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbVtdfSBvYmpzIE9nZ2V0dGkgZ2VuZXJpY2kgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzW119IGNvbHVtbnMgQ29sb25uZSByaWNoaWVzdGUgZGFsbCdlc3BvcnRhemlvbmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckdlbmVyaWNFeHBvcnQob2JqczogR2VuZXJpY0l0ZW1bXSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGxldCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICBvYmpzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09IDApXHJcbiAgICAgICAgaGVhZGVycyA9IHRoaXMucGFyc2VBbmRHZXRHZW5lcmljSGVhZGVycyhvYmosIGNvbHVtbnMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmljbyBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yR2VuZXJpY0V4cG9ydCoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZDb2x1bW5bXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iajogR2VuZXJpY0l0ZW0sIGNvbHVtbnM6IENzdkhlYWRlcnNbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBpZiAoIW9iai5wcm9wZXJ0aWVzKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy9NaXJhY2xlIGluY29taW5nXHJcbiAgICBjb2x1bW5zLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBvYmoucHJvcGVydGllc1t0LmtleV07XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHQua2V5ICsgXCJfZXhwXCIsIHsgdmFsdWU6IHByb3BWYWx1ZSwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbDogdC5sYWJlbCwga2V5OiB0LmtleSArIFwiX2V4cFwiLCBvcmRlcjogdC5vcmRlciwgdHlwZTogdC50eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9UaXJhdGkgZnVvcmkgdHV0dGkgZ2xpIGhlYWRlciBmYWNjaW8gc29ydCBzdWxsJ29yZGluYW1lbnRvXHJcbiAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiB7IHJldHVybiBhLm9yZGVyIC0gYi5vcmRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0SGVhZGVycyhvYmo6IGFueSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgdmFyIGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG5cclxuICAgIC8vIE1pcmFjbGUgaW5jb21pbmdcclxuICAgIGxldCBleHBvcnRQcm9wcyA9IG9ialtleHBvcnRMaXN0XSB8fCBbXTtcclxuICAgIGlmIChleHBvcnRQcm9wcy5sZW5ndGggPT0gMClcclxuICAgICAgY29uc29sZS53YXJuKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBOZXNzdW5hIGNvbG9ubmEgY29uZmlndXJhdGEgZGEgZXNwb3J0YXJlIVwiKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cG9ydFByb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwcm9wID0gZXhwb3J0UHJvcHNbaV07XHJcbiAgICAgIGxldCBwcm9wQmFzZSA9IFwiXCI7XHJcbiAgICAgIGxldCB0b0NhbGw6IEZ1bmN0aW9uO1xyXG4gICAgICBpZiAocHJvcC5lbmRzV2l0aChsaXN0Q3N2SGRyUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGxpc3RDc3ZIZHJQcmVmaXgsICcnKTtcclxuICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlTGlzdC5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHByb3AuZW5kc1dpdGgoZGljdGlvbmFyeUNzdkhkclByZWZpeCkpIHtcclxuICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlRGljdGlvbmFyeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsICcnKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChwcm9wLmVuZHNXaXRoKGNzdlZpc1ByZWZpeCkpIHtcclxuICAgICAgICBwcm9wQmFzZSA9IHByb3AucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9ialtwcm9wQmFzZSArIGNzdlZhbHVlTmF2aWdhdG9yXSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VPYmplY3QuYmluZCh0aGlzKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlUHJvcGVydHkuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRvQ2FsbClcclxuICAgICAgICB0b0NhbGwob2JqLCBwcm9wQmFzZSwgaGVhZGVycywgY29sdW1uc1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIHNpbmdvbGEgcHJvcHJpZXTDoC4gXHJcbiAgICogVmllbmUgZ2VuZXJhdG8gbCdoZWFkZXIgZSBsYSBwcm9wcmlldMOgIHJlbGF0aXZhIGFsIHZhbG9yZSBmb3JtYXR0YXRvIG8gbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VQcm9wZXJ0eShvYmo6IGFueSwgcHJvcDogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGNvbHVtbnNTZWxlY3Rpb24/OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9KSB7XHJcbiAgICBsZXQgdG9FbWl0OiBib29sZWFuID0gb2JqW3Byb3AgKyBjc3ZWaXNQcmVmaXhdO1xyXG4gICAgbGV0IGZvcm1hdDogc3RyaW5nID0gb2JqW3Byb3AgKyBjc3ZGb3JtYXRQcmVmaXhdO1xyXG4gICAgbGV0IHByb3BLZXkgPSBvYmpbcHJvcCArIGNzdlByb3BLZXldO1xyXG5cclxuICAgIGlmIChwcm9wS2V5ICYmICFjb2x1bW5zU2VsZWN0aW9uW3Byb3BLZXldICYmIE9iamVjdC5rZXlzKGNvbHVtbnNTZWxlY3Rpb24pLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc29sZS5sb2coXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIENvbG9ubmEgZGEgbm9uIGVzcG9ydGFyZTogXCIgKyBwcm9wS2V5KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsYmwgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcbiAgICBpZiAodG9FbWl0ICYmIGxibCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAvLyBTZSBub24gaG8gdW4gZm9ybWF0byBlc3BvcnRvIGRpcmV0dGFtZW50ZVxyXG4gICAgICBpZiAoIWZvcm1hdCkge1xyXG4gICAgICAgIC8vIFNlIMOoIHVuIGZvcm1hdG8gZGF0YSBtaSBhc3NpY3VybyBkaSBub24gc3RhbXBhcmUgbWFpIHVuYSBkYXRhIDAwOjAwOjAwIGFsdHJpbWVudGkgaW4gZXNwb3J0YXppb25lIHZpZW5lIHVubyBzY2hpZm9cclxuICAgICAgICB2YXIgdmFsID0gb2JqW3Byb3BdID8gdGhpcy5kYXRlcy50cmltU2Vjb25kcyhvYmpbcHJvcF0udG9TdHJpbmcoKSkgOiBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AgKyBcIl9ub2ZtdFwiLCB7IHZhbHVlOiB2YWwsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbDogbGJsID8gbGJsIDogcHJvcCArIFwiX25vZm10XCIsIGtleTogcHJvcCArIFwiX25vZm10XCIsIG9yZGVyOiBvcmRlciwgdHlwZTogXCJzdHJpbmdcIiwgcHJvcEtleTogcHJvcEtleSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBDYXNvIGZvcm1hdG8gbnVtZXJpY29cclxuICAgICAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgICAvLyBDaGVjayBjb25zaWRlcmFuZG8gbGEgcG9zc2liaWxpdMOgIGRpIHplcmlcclxuICAgICAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF0gIT0gbnVsbCA/IG9ialtwcm9wXS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICAgIC8vIEVsaW1pbm8gdHV0dGUgbGUgdmlyZ29sZSAoaW5kaWNhdG9yaSBkaSBtaWdsaWFpYSBwZXIgbGEgY3VsdHVyZSBkZWZhdWx0IGVuLVVTKVxyXG4gICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgICAgIC8vIElsIHNpbmdvbG8gcHVudG8gY2hlIGMnw6gsIHNlIHByZXNlbnRlIChzZXBhcmF0b3JlIGRlY2ltYWxpKSBsbyB0cmFzZm9ybW8gaW4gdmlyZ29sYVxyXG4gICAgICAgICAgbGV0IHZhbENvbnZlcnRlZCA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcblxyXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCArIFwiX2ZtdFwiLCB7IHZhbHVlOiB2YWxDb252ZXJ0ZWQsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiBsYmwgPyBsYmwgOiBwcm9wICsgXCJfZm10XCIsIGtleTogcHJvcCArIFwiX2ZtdFwiLCBvcmRlcjogb3JkZXIsIHR5cGU6IFwibnVtYmVyXCIsIHByb3BLZXk6IHByb3BLZXkgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIFNlIGhvIHVuIGZvcm1hdG8gZGF0YSB0cmFzZm9ybW8gaW4gZGF5anMsIGZvcm1hdHRvIGVkIGVzcG9ydG9cclxuICAgICAgICAgIC8vIFBlciBsYSB0cmFzZm9ybWF6aW9uZSBpbiBkYXlqcyBwcm92byBwcmltYSBhIHBhc3NhcmdsaSBsYSBzdHJpbmdhIGRpIG5ldHRvLCBzcGVyYW5kbyBsYSByaWNvbm9zY2FcclxuICAgICAgICAgIC8vIFNlIG5vbiBmdW56aW9uYSBwcm92byBhIGRlZmluaXJnbGkgbGEgZm9ybWF0dGF6aW9uZSBzdGFuZGFyZCBkZWwgbWV0ZXJpbmcgcGVyIHF1ZWwgbGluZ3VhZ2dpb1xyXG4gICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZGF0ZXMuZ2V0Rm9ybWF0dGVkKG9ialtwcm9wXSwgZm9ybWF0Lmxlbmd0aCA8PSAxMCwgZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AgKyBcIl9mbXRcIiwgeyB2YWx1ZTogdmFsID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiBsYmwgPyBsYmwgOiBwcm9wICsgXCJfZm10XCIsIGtleTogcHJvcCArIFwiX2ZtdFwiLCBvcmRlcjogb3JkZXIsIHR5cGU6IFwiZGF0ZVwiLCBwcm9wS2V5OiBwcm9wS2V5IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBzaW5nb2xhIHByb3ByaWV0w6AgZGEgdW4gb2dnZXR0by4gXHJcbiAgICogVmllbmUgZ2VuZXJhdG8gbCdoZWFkZXIgZSBsYSBwcm9wcmlldMOgIHJlbGF0aXZhIGFsIHZhbG9yZSBmb3JtYXR0YXRvIG8gbm8uIFxyXG4gICAqIFxyXG4gICAqIFBlciBvdHRlbmVyZSBpbCB2YWxvcmUgZSBsJ2hlYWRlciBkZWxsYSBwcm9wcmlldMOgIHZlbmdvbm8gdXRpbGl6emF0aSBpIG5hdmlnYXRvcmkgYXV0by1nZW5lcmF0aSBuZWwgZGVjb3JhdG9yZSAqKkV4cG9ydEFzKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VPYmplY3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdKSB7XHJcbiAgICAvL3NlIHF1ZXN0YSBwcm9wcmlldMOgIGhhIHVuIG5hdmlnYXRvciBzaWduaWZpY2EgY2hlIGRlcml2YSBkYSB1biBvZ2dldHRvIGludGVybm8sIHJlY3VwZXJvIGlsIHZhbG9yZSBpbiBxdWVzdGEgZmFzZSBkYXRvIGNoZSBwcmltYSBub24gY2UgbCdob1xyXG4gICAgbGV0IHZhbHVlbmF2aWdhdG9yID0gb2JqW3Byb3AgKyBjc3ZWYWx1ZU5hdmlnYXRvcl07XHJcblxyXG4gICAgLy9Fcy4gZGkgdmFsdWVuYXZpZ2F0b3Igb2JqLnN1Ym9iai5zdWJzdWJvYmoucHJvcGVydHlcclxuICAgIGxldCBqbXBzID0gdmFsdWVuYXZpZ2F0b3Iuc3BsaXQoXCIuXCIpO1xyXG4gICAgLy9NaSBjbG9ubyBsJ29nZ2V0dG8gb3JpZ2luYWxlIHBlciBub24gdWNjaWRlcmdsaSBpIHJpZmVyaW1lbnRpXHJcbiAgICBsZXQgY2xvbmUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xyXG4gICAgLy9TYWx0byByaWNvcnNpdmFtZW50ZSBzdSBtZSBzdGVzc28gcGVyIGFycml2YXJlIGFsbGEgcHJvcHJpZXTDoFxyXG4gICAgLy9TYWx0byAxID4gZGl2ZW50YSBvYmpcclxuICAgIC8vU2FsdG8gMiA+IGRpdmVudGEgb2JqLnN1Ym9ialxyXG4gICAgLy9lY2MuLi5cclxuICAgIGptcHMuZm9yRWFjaChwcCA9PiB7IGNsb25lID0gY2xvbmVbcHBdOyB9KTtcclxuXHJcbiAgICAvL1ZhbG9yZSBmaW5hbGUgOkRcclxuICAgIGxldCB2YWx1ZSA9IGNsb25lO1xyXG4gICAgbGV0IGxibCA9IG9ialtwcm9wICsgY3N2SGRyUHJlZml4XTtcclxuICAgIGxldCBvcmRlciA9IG9ialtwcm9wICsgY3N2T3JkUHJlZml4XTtcclxuXHJcbiAgICAvL1NlIHBlciBxdWVzdGEgcHJvcHJpZXTDoCBobyB1biBmb3JtYXRvIGxvIGFwcGxpY29cclxuICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IG9ialtwcm9wICsgY3N2Rm9ybWF0UHJlZml4XTtcclxuICAgIGxldCB0eXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnID0gXCJzdHJpbmdcIjtcclxuICAgIGlmIChmb3JtYXQgPT0gXCJGXCIpIHtcclxuICAgICAgbGV0IHZhbCA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC8sLywgXCJcIik7XHJcbiAgICAgIHZhbHVlID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuICAgICAgdHlwZSA9IFwibnVtYmVyXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3JtYXQpIHtcclxuICAgICAgdmFsdWUgPSB0aGlzLmRhdGVzLmdldEZvcm1hdHRlZCh2YWx1ZSwgZm9ybWF0Lmxlbmd0aCA8PSAxMCwgZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgdHlwZSA9IFwiZGF0ZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHsgdmFsdWU6IHZhbHVlID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiBsYmwgPyBsYmwgOiBwcm9wLCBrZXk6IHByb3AsIG9yZGVyOiBvcmRlciwgdHlwZTogdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUxpc3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdKSB7XHJcbiAgICBsZXQgaGVhZGVybmF2aWdhdG9yID0gb2JqW3Byb3AgKyBsaXN0Q3N2SGRyUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgbGlzdENzdlZhbFByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVmb3JtYXQgPSBvYmpbcHJvcCArIGxpc3RDc3ZWYWxGb3JtYXRdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcblxyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgaGVhZGVyID0gXCJcIjtcclxuXHJcbiAgICAgIC8vIFBlciBsJ2hlYWRlciBzaSBjb25zaWRlcmEgYSBzZSBzdGFudGUgb2duaSBwZXp6byBzZXBhcmF0byBkYSBzcGF6aW8gcGVyIGZhcmUgbGUgY29uY2F0ZW5hemlvbmlcclxuICAgICAgaGVhZGVyc3BsaXQuZm9yRWFjaChwciA9PiB7XHJcbiAgICAgICAganVtcHMgPSBwci5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICAgIGp1bXBzLmZvckVhY2gocHAgPT4geyB0bXBSZXMgPSB0bXBSZXNbcHBdOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFoZWFkZXIpIGhlYWRlciA9IHRtcFJlcztcclxuICAgICAgICBlbHNlIGhlYWRlciArPSBcIiBcIiArIHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBqdW1wcyA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLlwiKTtcclxuICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHRtcFJlcztcclxuXHJcbiAgICAgIGxldCB0eXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnID0gXCJzdHJpbmdcIjtcclxuICAgICAgaWYgKHZhbHVlZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICAgIHZhbHVlID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuICAgICAgICB0eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh2YWx1ZWZvcm1hdCkge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQob2JqW3Byb3BdLCB2YWx1ZWZvcm1hdC5sZW5ndGggPD0gMTAsIHZhbHVlZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICB0eXBlID0gXCJkYXRlXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AgKyBpZHgsIHsgdmFsdWU6IHZhbHVlID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWw6IGhlYWRlciwga2V5OiBwcm9wICsgaWR4LCBvcmRlcjogb3JkZXIgKyBpZHgsIHR5cGU6IHR5cGUsIHByb3BLZXk6IG51bGwgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIGxpc3RhIGRpIHZhbG9yaSBwaXZvdHRhdGkgZGluYW1pY2FtZW50ZTpcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBpbCB2YWxvcmUgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gbCdoZWFkZXIgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gQ29uIGlsIHZhbG9yZSBjaSBjcmVvIGxhIHByb3BlcnR5XHJcbiAgICogXHJcbiAgICogPT4gQ29uIGwnaGVhZGVyIGUgaWwgcmlmZXJpbWVudG8gYWxsYSBwcm9wZXJ0eSBhcHBlbmEgY3JlYXRhIGNyZW8gdW4gcmVjb3JkIG5lZ2xpIGhlYWRlciBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VEaWN0aW9uYXJ5KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSkge1xyXG4gICAgbGV0IGhlYWRlcm5hdmlnYXRvciA9IG9ialtwcm9wICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXhdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcbiAgICAgIHZhciBoZWFkZXJzcGxpdCA9IGhlYWRlcm5hdmlnYXRvci5zcGxpdChcIiBcIik7XHJcbiAgICAgIHZhciBoZWFkZXIgPSBcIlwiO1xyXG5cclxuICAgICAgaGVhZGVyc3BsaXQuZm9yRWFjaChwciA9PiB7XHJcbiAgICAgICAganVtcHMgPSBwci5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICAgIGp1bXBzLmZvckVhY2gocHAgPT4geyB0bXBSZXMgPSB0bXBSZXNbcHBdOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFoZWFkZXIpIGhlYWRlciA9IHRtcFJlcztcclxuICAgICAgICBlbHNlIGhlYWRlciArPSBcIiBcIiArIHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgdmFsdWVzcGxpdCA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgdmFsdWVzcGxpdC5mb3JFYWNoKCh0LCBpZHhpbnRlcm5hbCkgPT4ge1xyXG4gICAgICAgIHZhciBuYXZpZyA9IHQuc3BsaXQoXCItXCIpWzFdO1xyXG4gICAgICAgIHZhciBkZXNjID0gdC5zcGxpdChcIi1cIilbMF07XHJcblxyXG4gICAgICAgIGp1bXBzID0gbmF2aWcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdG1wUmVzO1xyXG5cclxuICAgICAgICBsZXQgcHJvcG5hbWUgPSBwcm9wICsgaWR4LnRvU3RyaW5nKCkgKyBpZHhpbnRlcm5hbC50b1N0cmluZygpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BuYW1lLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWw6IGhlYWRlciArIFwiIFwiICsgZGVzYywga2V5OiBwcm9wbmFtZSwgb3JkZXI6IG9yZGVyICsgaWR4LCB0eXBlOiAnc3RyaW5nJywgcHJvcEtleTogbnVsbCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkZWxsYSBkZXNlcmlhbGl6emF6aW9uZSBkZWdsaSBvZ2dldHRpIGRhIGVzcG9ydGFyZS4gTWVzc28gYSBsaXZlbGxvIGRpIGxpYnJlcmlhIGluIG1vZG8gY2hlIHF1YWxvcmEgY2kgZm9zc2UgZGEgY2FtYmlhcmUgbGlicmVyaWEgXHJcbiAgICogdHV0dGUgbGUgbWFudXRlbnppb25pIHNpYW5vIGNvbmNlbnRyYXRlIHF1aVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgZGEgZGVzZXJpYWxpenphcmVcclxuICAgKiBAcGFyYW0ge2FueX0gdHlwZSBUaXBvIGRhIHVzYXJlIGNvbWUgcHJvdG90aXBvIHBlciBsYSBkZXNlcmlhbGl6emF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHthbnl9IE9nZ2V0dGkgZGVzZXJpYWxpenphdGlcclxuICAgKi9cclxuICBwdWJsaWMgZGVzZXJpYWxpemVGb3JFeHBvcnQoaXRlbXM6IGFueVtdLCB0eXBlOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIERlc2VyaWFsaXplKGl0ZW1zLCB0eXBlKTtcclxuICB9XHJcbn0iXX0=
543
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU87QUFDUCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXhDLFdBQVc7QUFDWCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFRalE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQThCO0lBQy9ELE9BQU8sU0FBUyxZQUFZLENBQXlDLFdBQWM7UUFDakYsT0FBTyxLQUFNLFNBQVEsV0FBVztZQUF6Qjs7Z0JBQTRCLFlBQU8sR0FBRyxHQUFHLENBQUM7WUFBQyxDQUFDO1NBQUEsQ0FBQztJQUN0RCxDQUFDLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsU0FBaUIsSUFBSSxFQUFFLFVBQWtCLElBQUksRUFBRSxFQUFFLENBQ3JHLENBQUMsTUFBYyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtJQUN0QyxJ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O0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksb0JBQW9CLENBQUMsS0FBWSxFQUFFLElBQVM7UUFDakQsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7OzBHQXJaVSxhQUFhOzhHQUFiLGFBQWEsY0FERCxNQUFNOzJGQUNsQixhQUFhO2tCQUR6QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFR5cGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gTGlic1xyXG5pbXBvcnQgeyBEZXNlcmlhbGl6ZSB9IGZyb20gXCJjZXJpYWxpemVcIjtcclxuXHJcbi8vIEVzZmFlbnphXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcblxyXG5pbXBvcnQgeyBleHBvcnRMaXN0LCBjc3ZGb3JtYXRQcmVmaXgsIGNzdkhkclByZWZpeCwgY3N2T3JkUHJlZml4LCBjc3ZWYWx1ZU5hdmlnYXRvciwgY3N2VmlzUHJlZml4LCBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4LCBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4LCBsaXN0Q3N2SGRyUHJlZml4LCBsaXN0Q3N2VmFsRm9ybWF0LCBsaXN0Q3N2VmFsUHJlZml4LCBjc3ZQcm9wS2V5LCBsb2NQcm9wZXJ0eSB9IGZyb20gXCIuLi9tb2RlbHMvRXhwb3J0Q29uc3RzXCI7XHJcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zLmRhdGVzLnNlcnZpY2UnO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBDc3ZIZWFkZXJzIH0gZnJvbSBcIi4uL21vZGVscy9Dc3ZIZWFkZXJzXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9HZW5lcmljSXRlbVwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGNoZSBmb3JuaXNjZSBsYSBjbGFzc2UgZGkgbG9jYWxpenphemlvbmUgcGVyIHR1dHRlIGxlIHByb3ByaWV0w6AgZXNwb3J0YXRlIGNvbiBARXhwb3J0IGUgcXVhbHNpYXNpIGFsdHJvIHRhZyBjaGUgcmljaGllZGEgbG9jYWxpenphemlvbmkuXHJcbiAqIFxyXG4gKiBTb3N0YW56aWxhbWVudGUgYWdnaXVuZ2UgbGEgcHJvcHJpZXTDoCAqKl9fbG9jX18qKiBhbGwnb2dnZXR0byBjcmVhdG8gZGFsbGEgY2xhc3NlIGNvcnJlbnRlIGFzc2VnbmFuZG9nbGkgY29tZSB2YWxvcmUgaWwgdGlwbyBkZWwgTG9jYWxpemF0aW9uU2VydmljZSBkYSB1c2FyZSBwZXIgbGEgdHJhZHV6aW9uZVxyXG4gKiBcclxuICogQHBhcmFtIHtUeXBlPExvY2FsaXphdGlvblNlcnZpY2U+fSBsb2MgVGlwbyBlcmVkaXRhdG8gZGFsIExvY2FsaXphdGlvblNlcnZpY2UgY2hlIHB1w7IgZXNzZXJlIGNyZWF0byBhIHJ1bnRpbWUgc290dG8gY29udGVzdG8gZGVsbGEgREkgZGkgQW5ndWxhclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydExvY2FsaXphdGlvbihsb2M6IFR5cGU8TG9jYWxpemF0aW9uU2VydmljZT4pIHtcclxuICByZXR1cm4gZnVuY3Rpb24gaW50ZWdyYXRlTG9jPFQgZXh0ZW5kcyB7IG5ldyAoLi4uYXJnczogYW55W10pOiB7fSB9Pihjb25zdHJ1Y3RvcjogVCkgIHtcclxuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGNvbnN0cnVjdG9yIHsgX19sb2NfXyA9IGxvYzsgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIHByb3ByaWV0w6Agc2luZ29sYS4gXHJcbiAqIFZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIGNpYW86IHN0cmluZztcclxuICogY2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCJcclxuICogYGBgXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXIgVGl0b2xvIGRlbGxhIGNvbG9ubmEgbmVsIGZpbGUgQ1NWIGVzcG9ydGF0b1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IEZvcm1hdG8gZGkgZXNwb3J0YXppb25lLiBQdcOyIGVzc2VyZSB1biBmb3JtYXRvIGRhdGEgcGVyIGkgY2FtcGkgZGF0YSBvICdGJyBwZXIgaSBjYW1waSBmbG9hdGluZyBwb2ludFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXI6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSBudWxsLCB0YWJsZWlkOiBzdHJpbmcgPSBudWxsKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGZvcm1hdClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogISFoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIGlmKHRhYmxlaWQpXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2UHJvcEtleSwgeyB2YWx1ZTogdGFibGVpZCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XS5wdXNoKHByb3BlcnR5S2V5ICsgY3N2VmlzUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgY3N2VmlzUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIG9nZ2V0dG8uIFxyXG4gKiBQZXIgb2duaSBwcm9wcmlldMOgIGRlbGwnb2dnZXR0byB2ZXJyYW5ubyBnZW5lcmF0ZSAzIHByb3ByaWV0w6AgY2hlIGdlc3RpcmFubm8gbCdlc3BvcnRhemlvbmU6IChwcm9wLCBwcm9wX2NzdnZpcywgcHJvcF9jc3ZoZHIpLiBcclxuICogUGVyIGVzc2VyZSBlc3BvcnRhdGUsIGxlIHByb3ByaWV0w6AgZGVsbCdvZ2dldHRvIGRldm9ubyBlc3NlcmUgbWFyY2F0ZSBjb24gaSBEZWNvcmF0b3JpIGRpIGVzcG9ydGF6aW9uZVxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIE15T2JqIHtcclxuICogICAgIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiAgICAgY2lhbzogc3RyaW5nO1xyXG4gKiB9XHJcbiAqIFxyXG4gKiBARXhwb3J0T2JqZWN0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogdGVzdDogTXlPYmo7IFxyXG4gKiBgYGBcclxuICogXHJcbiAqIE5hc2NlcmFubm8gbGUgc2VndWVudGkgcHJvcHJpZXTDoCBuZWxsJ29nZ2V0dG8gZXNwb3J0YWJpbGU6XHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogdGVzdGNpYW86IHN0cmluZzsgPT4gVmFsb3JlIGRpIE15T2JqLmNpYW9cclxuICogdGVzdGNpYW9fY3N2dmlzOiBzdHJpbmc7ID0+IHRydWVcclxuICogdGVzdGNpYW9fY3N2aGRyOiBzdHJpbmcgPT4gXCJNeUhlYWRlclwiIFxyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge2FueX0gdHlwZSBUaXBvIGRhIGVzcG9ydGFyZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydEFzID0gKG9yZGVyOiBudW1iZXIsIHR5cGU6IGFueSwgcHJlZml4Pzogc3RyaW5nKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgdmFyIHQgPSBuZXcgdHlwZSgpO1xyXG4gICAgdmFyIHByb3BzID0gdFtleHBvcnRMaXN0XTtcclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgIGxldCBwcm9wID0gcHJvcHNbaV0ucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgaWYgKHR5cGVvZiB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdmFyIHRvRW1pdDogYm9vbGVhbiA9IHRbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICAgICAgdmFyIGxibCA9IHRbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICAgICAgdmFyIG9yZGVyUHJvcCA9IHRbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcbiAgICAgICAgaWYgKGZvcm1hdClcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkZvcm1hdFByZWZpeCwgeyB2YWx1ZTogZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXJQcm9wICsgb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yLCB7IHZhbHVlOiBwcm9wZXJ0eUtleSArIFwiLlwiICsgcHJvcCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogdG9FbWl0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiAocHJlZml4ID8gcHJlZml4ICsgJyAnIDogJycpICsgbGJsLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXhdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1bmEgbGlzdGEsIFxyXG4gKiBzaSB1dGlsaXp6YW5vIDIgbmF2aWdhdG9yIHJpc3BldHRpdmFtZW50ZSBwZXIgbGEgdmFsb3JpenphemlvbmUgZGVsbCdIZWFkZXIgZSBkZWwgVmFsb3JlIGUgXHJcbiAqIHBlciBvZ25pIGVsZW1lbnRvIGRlbGwnYXJyYXkgdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKVxyXG4gKiBcclxuICogQVRURU5aSU9ORTogR2xpIG9nZ2V0dGkgZXNwb3J0YXRpIGluIHF1ZXN0YSBtb2RhbGl0w6Agbm9uIGRldm9ubyBwcmVzZW50YXJlIGFsdHJpIHRhZyBkaSB0aXBvIEBFeHBvcnR7Li4ufSBhbGwnaW50ZXJuby4gRmEgdHV0dG8gcXVlc3RvIGRlY29yYXRvcmVcclxuICogXHJcbiAqIEkgbmF2aWdhdG9yIGhhbm5vIHF1ZXN0YSBjb252ZW56aW9uZTpcclxuICogXHJcbiAqIC4gLS0+IGRpdmlkZSBkdWUgcHJvcHJpZXTDoCBkYSByaWNoaWFtYXJlIGNvbnNlY3V0aXZhbWVudGU6IFwiYS5iXCIgcmljaGlhbWVyw6AgXCJvYmouYS5iXCI7XHJcbiAqIFxyXG4gKiB8IC0tPiBkaXZpZGUgcGnDuSBwcm9wcmlldMOgIHBlciBsZSBjb25jYXRlbmF6aW9uaSBjb24gdW5vIHNwYXppbyBmcmEgdW5hIGUgbCdhbHRyYTogXCJyZWdkZXNjfHNsaWNlLnNsaWNlbmFtZVwiIGRpdmVudGVyw6Agb2JqLnJlZ2Rlc2MgKyBcIiBcIiArIG9iai5zbGljZS5zbGljZW5hbWVcclxuICogXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcm5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdGl0b2xvIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZW5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdmFsb3JlIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZWZvcm1hdCBGb3JtYXRvIGRpIGVzcG9ydGF6aW9uZSBwZXIgaSB2YWxvcmkgc2VsZXppb25hdGkgZGFsICoqdmFsdWVuYXZpZ2F0b3IqKi4gUHXDsiBlc3NlcmUgdW4gZm9ybWF0byBkYXRhIHBlciBpIGNhbXBpIGRhdGEgbyAnRicgcGVyIGkgY2FtcGkgZmxvYXRpbmcgcG9pbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRMaXN0ID0gKG9yZGVyOiBudW1iZXIsIGhlYWRlcm5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZW5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZWZvcm1hdDogc3RyaW5nID0gbnVsbCkgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2T3JkUHJlZml4LCB7IHZhbHVlOiBvcmRlciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2VmFsUHJlZml4LCB7IHZhbHVlOiB2YWx1ZW5hdmlnYXRvciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXJuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbEZvcm1hdCwgeyB2YWx1ZTogdmFsdWVmb3JtYXQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGxpc3RDc3ZIZHJQcmVmaXgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIGRpemlvbmFyaW8uIFNlIGFkIGVzZW1waW8gc2kgdm9nbGlvbm8gZ2VuZXJhcmUgbGUgY29sb25uZVxyXG4gKiBcclxuICogVmFsb3JlIEEgPSAxXHJcbiAqIFxyXG4gKiBWYWxvcmUgQiA9IDJcclxuICogXHJcbiAqIFZhbG9yZSBDID0gM1xyXG4gKiBcclxuICogcGFydGVuZG8gZGEgdW4gb2dnZXR0byBpbml6aWFsZSB7IFZhbG9yZSB7IEE6IDEsIEI6IDIsIEM6IDMgfSB9XHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydERpY3Rpb25hcnkgPSAob3JkZXI6IG51bWJlciwgaGVhZGVybmF2aWdhdG9yOiBzdHJpbmcsIHZhbHVlbmF2aWdhdG9yOiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIHNpIG9jY3VwYSBkZWxsJ2VzcG9ydGF6aW9uZSBkZWdsaSBvZ2dldHRpIG1hcmNhdGkgZGFpIERlY29yYXRvcmkgKipFeHBvcnREaWN0aW9uYXJ5KiosICoqRXhwb3J0TGlzdCoqLCAqKkV4cG9ydEFzKiogbyAqKkV4cG9ydCoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogXCJyb290XCJ9KVxyXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvc3RydXR0b3JlXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVzOiBEYXRlU2VydmljZSkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueVtdfSBvYmpzIE9nZ2V0dGkgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0dXBGb3JFeHBvcnQob2JqczogYW55W10sIGNvbHVtbnM6IHN0cmluZ1tdID0gW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgbGV0IGhlYWRlcnNDYWNoZSA9IHt9O1xyXG5cclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICAvLyBHbGkgaGVhZGVyIGxpIHJhY2NvbGdvIHR1dHRpIHBvaSBmYWNjaW8gdWFuIGRpc3RpbmN0IGluIG1vZG8gZGEgZXNwb3J0YXJlIHR1dHRlIGxlIHByb3ByaWV0w6AgcGVyIGJlbmVcclxuICAgIGxldCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9ID0ge307XHJcblxyXG4gICAgaWYgKGNvbHVtbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucz8ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgY29sdW1uU2VsZWN0aW9uRGljdGlvbmFyeVtjb2x1bW5zW2ldXSA9IHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoZHMgPSB0aGlzLnBhcnNlQW5kR2V0SGVhZGVycyhvYmpzW2ldLCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5KTtcclxuICAgICAgLy8gQWdnaXVuZ28gZ2xpIGhlYWRlciBmYWNlbmRvIGluIG1vZG8gZGkgbm9uIGFnZ2l1bmdlcm5lIG1haSBkdWUgdWd1YWxpIHBlciBub24gZG92ZXIgZmFyZSB1bmEgZGlzdGluY3QgZG9wb1xyXG4gICAgICAvLyBjaGUgY29zdGVyZWJiZSBjb211bnF1ZSByaXNvcnNlLiBVdGlsaXp6byB1biBkaXppb25hcmlvIGQnYXBwb2dnaW8gcGVyIGxvb2t1cCBpc3RhbnRhbmVpXHJcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzQ2FjaGVbaGRzW2tdLmtleV0pIHtcclxuICAgICAgICAgIGhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSA9IHRydWU7XHJcbiAgICAgICAgICBoZWFkZXJzLnB1c2goaGRzW2tdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT0gMClcclxuICAgICAgcmV0dXJuIGhlYWRlcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFNlIG1pIGFycml2YSBsYSBsaXN0YSBkaSBjb2xvbm5lIG5vbiBtaSBkw6Agc29sbyBsYSB2aXNpYmlsaXTDoCwgbWEgYW5jaGUgbCdvcmRpbmFtZW50b1xyXG4gICAgICAvLyBsZSBlc3BvcnRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICAgIGxldCBvcmRlcmVkSGVhZGVycyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgdGhpc0lkID0gY29sdW1uc1tpXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWFkZXJzW2ldLnByb3BLZXkgPT0gdGhpc0lkKSB7XHJcbiAgICAgICAgICAgIG9yZGVyZWRIZWFkZXJzLnB1c2goaGVhZGVyc1tpXSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3JkZXJlZEhlYWRlcnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIHVuYSBsaXN0YSBkaSBvZ2dldHRpIGdlbmVyaWNpIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGludGVncmEgb2duaSBvZ2dldHRvIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbVtdfSBvYmpzIE9nZ2V0dGkgZ2VuZXJpY2kgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzW119IGNvbHVtbnMgQ29sb25uZSByaWNoaWVzdGUgZGFsbCdlc3BvcnRhemlvbmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckdlbmVyaWNFeHBvcnQob2JqczogR2VuZXJpY0l0ZW1bXSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGxldCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICBvYmpzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09IDApXHJcbiAgICAgICAgaGVhZGVycyA9IHRoaXMucGFyc2VBbmRHZXRHZW5lcmljSGVhZGVycyhvYmosIGNvbHVtbnMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmljbyBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yR2VuZXJpY0V4cG9ydCoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZDb2x1bW5bXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iajogR2VuZXJpY0l0ZW0sIGNvbHVtbnM6IENzdkhlYWRlcnNbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBpZiAoIW9iai5wcm9wZXJ0aWVzKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy9NaXJhY2xlIGluY29taW5nXHJcbiAgICBjb2x1bW5zLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBvYmoucHJvcGVydGllc1t0LmtleV07XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHQua2V5ICsgXCJfZXhwXCIsIHsgdmFsdWU6IHByb3BWYWx1ZSwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbDogdC5sYWJlbCwga2V5OiB0LmtleSArIFwiX2V4cFwiLCBvcmRlcjogdC5vcmRlciwgdHlwZTogdC50eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9UaXJhdGkgZnVvcmkgdHV0dGkgZ2xpIGhlYWRlciBmYWNjaW8gc29ydCBzdWxsJ29yZGluYW1lbnRvXHJcbiAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiB7IHJldHVybiBhLm9yZGVyIC0gYi5vcmRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0SGVhZGVycyhvYmo6IGFueSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgdmFyIGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG5cclxuICAgIC8vIE1pcmFjbGUgaW5jb21pbmdcclxuICAgIGxldCBleHBvcnRQcm9wcyA9IG9ialtleHBvcnRMaXN0XSB8fCBbXTtcclxuICAgIGxldCBsb2MgPSB0aGlzLmdldExvY2FsaXphdGlvblNlcnZpY2Uob2JqKTtcclxuXHJcbiAgICBpZiAoZXhwb3J0UHJvcHMubGVuZ3RoID09IDApXHJcbiAgICAgIGNvbnNvbGUud2FybihcIltAZXNmYWVuemEvZXh0ZW5zaW9uc10gTmVzc3VuYSBjb2xvbm5hIGNvbmZpZ3VyYXRhIGRhIGVzcG9ydGFyZSFcIik7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRQcm9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcHJvcCA9IGV4cG9ydFByb3BzW2ldO1xyXG4gICAgICBsZXQgcHJvcEJhc2UgPSBcIlwiO1xyXG4gICAgICBsZXQgdG9DYWxsOiBGdW5jdGlvbjtcclxuICAgICAgaWYgKHByb3AuZW5kc1dpdGgobGlzdENzdkhkclByZWZpeCkpIHtcclxuICAgICAgICBwcm9wQmFzZSA9IHByb3AucmVwbGFjZShsaXN0Q3N2SGRyUHJlZml4LCAnJyk7XHJcbiAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZUxpc3QuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChwcm9wLmVuZHNXaXRoKGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgpKSB7XHJcbiAgICAgICAgcHJvcEJhc2UgPSBwcm9wLnJlcGxhY2UoZGljdGlvbmFyeUNzdkhkclByZWZpeCwgJycpO1xyXG4gICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VEaWN0aW9uYXJ5LmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocHJvcC5lbmRzV2l0aChjc3ZWaXNQcmVmaXgpKSB7XHJcbiAgICAgICAgcHJvcEJhc2UgPSBwcm9wLnJlcGxhY2UoY3N2VmlzUHJlZml4LCAnJyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpbcHJvcEJhc2UgKyBjc3ZWYWx1ZU5hdmlnYXRvcl0gIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlT2JqZWN0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZVByb3BlcnR5LmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0b0NhbGwpXHJcbiAgICAgICAgdG9DYWxsKG9iaiwgcHJvcEJhc2UsIGhlYWRlcnMsIGNvbHVtbnNTZWxlY3Rpb24sIGxvYyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG5cclxuICAvKiogSGVscGVyIHBlciBvdHRlbmVyZSBpbCBzZXJ2aXppbyBkaSBsb2NhbGl6emF6aW9uZSByZWxhdGl2byBhZCB1bidlbnRpdMOgICovXHJcbiAgcHJpdmF0ZSBnZXRMb2NhbGl6YXRpb25TZXJ2aWNlKG9iamVjdDogYW55KTogTG9jYWxpemF0aW9uU2VydmljZSB7XHJcbiAgICBpZiAoIW9iamVjdFtsb2NQcm9wZXJ0eV0pXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogb2JqZWN0W2xvY1Byb3BlcnR5XSB9XSB9KTtcclxuICAgIHJldHVybiBpbmplY3Rvci5nZXQoTG9jYWxpemF0aW9uU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIHNpbmdvbGEgcHJvcHJpZXTDoC4gXHJcbiAgICogVmllbmUgZ2VuZXJhdG8gbCdoZWFkZXIgZSBsYSBwcm9wcmlldMOgIHJlbGF0aXZhIGFsIHZhbG9yZSBmb3JtYXR0YXRvIG8gbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VQcm9wZXJ0eShvYmo6IGFueSwgcHJvcDogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGNvbHVtbnNTZWxlY3Rpb24/OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9LCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBsZXQgdG9FbWl0OiBib29sZWFuID0gb2JqW3Byb3AgKyBjc3ZWaXNQcmVmaXhdO1xyXG4gICAgbGV0IGZvcm1hdDogc3RyaW5nID0gb2JqW3Byb3AgKyBjc3ZGb3JtYXRQcmVmaXhdO1xyXG4gICAgbGV0IHByb3BLZXkgPSBvYmpbcHJvcCArIGNzdlByb3BLZXldO1xyXG5cclxuICAgIGlmIChwcm9wS2V5ICYmICFjb2x1bW5zU2VsZWN0aW9uW3Byb3BLZXldICYmIE9iamVjdC5rZXlzKGNvbHVtbnNTZWxlY3Rpb24pLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc29sZS5sb2coXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIENvbG9ubmEgZGEgbm9uIGVzcG9ydGFyZTogXCIgKyBwcm9wS2V5KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0ZXh0ID0gb2JqW3Byb3AgKyBjc3ZIZHJQcmVmaXhdO1xyXG4gICAgbGV0IGxhYmVsID0gbG9jICYmIHRleHQgPyBsb2MubG9jKHRleHQpIDogdGV4dCB8fCBcIlwiO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIGlmICghdG9FbWl0KVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gU2Ugbm9uIGhvIHVuIGZvcm1hdG8gZXNwb3J0byBkaXJldHRhbWVudGVcclxuICAgIGlmICghZm9ybWF0KSB7XHJcbiAgICAgIC8vIFNlIMOoIHVuIGZvcm1hdG8gZGF0YSBtaSBhc3NpY3VybyBkaSBub24gc3RhbXBhcmUgbWFpIHVuYSBkYXRhIDAwOjAwOjAwIGFsdHJpbWVudGkgaW4gZXNwb3J0YXppb25lIHZpZW5lIHVubyBzY2hpZm9cclxuICAgICAgbGV0IHZhbCA9IG9ialtwcm9wXSA/IHRoaXMuZGF0ZXMudHJpbVNlY29uZHMob2JqW3Byb3BdLnRvU3RyaW5nKCkpIDogXCJcIjtcclxuICAgICAgbGV0IGtleSA9IHByb3AgKyBcIl9ub2ZtdFwiO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbCwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5LCBvcmRlciwgdHlwZTogXCJzdHJpbmdcIiwgcHJvcEtleSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBrZXkgPSBwcm9wICsgXCJfZm10XCI7XHJcblxyXG4gICAgICAvLyBDYXNvIGZvcm1hdG8gbnVtZXJpY29cclxuICAgICAgaWYgKGZvcm1hdCA9PSBcIkZcIikge1xyXG4gICAgICAgIC8vIENoZWNrIGNvbnNpZGVyYW5kbyBsYSBwb3NzaWJpbGl0w6AgZGkgemVyaVxyXG4gICAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF0gIT0gbnVsbCA/IG9ialtwcm9wXS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICAvLyBFbGltaW5vIHR1dHRlIGxlIHZpcmdvbGUgKGluZGljYXRvcmkgZGkgbWlnbGlhaWEgcGVyIGxhIGN1bHR1cmUgZGVmYXVsdCBlbi1VUylcclxuICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICAgIC8vIElsIHNpbmdvbG8gcHVudG8gY2hlIGMnw6gsIHNlIHByZXNlbnRlIChzZXBhcmF0b3JlIGRlY2ltYWxpKSBsbyB0cmFzZm9ybW8gaW4gdmlyZ29sYVxyXG4gICAgICAgIGxldCB2YWxDb252ZXJ0ZWQgPSB2YWwucmVwbGFjZShcIi5cIiwgXCIsXCIpO1xyXG5cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbENvbnZlcnRlZCwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXksIG9yZGVyLCB0eXBlOiBcIm51bWJlclwiLCBwcm9wS2V5IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFNlIGhvIHVuIGZvcm1hdG8gZGF0YSB0cmFzZm9ybW8gaW4gZGF5anMsIGZvcm1hdHRvIGVkIGVzcG9ydG9cclxuICAgICAgICAvLyBQZXIgbGEgdHJhc2Zvcm1hemlvbmUgaW4gZGF5anMgcHJvdm8gcHJpbWEgYSBwYXNzYXJnbGkgbGEgc3RyaW5nYSBkaSBuZXR0bywgc3BlcmFuZG8gbGEgcmljb25vc2NhXHJcbiAgICAgICAgLy8gU2Ugbm9uIGZ1bnppb25hIHByb3ZvIGEgZGVmaW5pcmdsaSBsYSBmb3JtYXR0YXppb25lIHN0YW5kYXJkIGRlbCBtZXRlcmluZyBwZXIgcXVlbCBsaW5ndWFnZ2lvXHJcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuZGF0ZXMuZ2V0Rm9ybWF0dGVkKG9ialtwcm9wXSwgZm9ybWF0Lmxlbmd0aCA8PSAxMCwgZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbCA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleSwgb3JkZXIsIHR5cGU6IFwiZGF0ZVwiLCBwcm9wS2V5IH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIHNpbmdvbGEgcHJvcHJpZXTDoCBkYSB1biBvZ2dldHRvLiBcclxuICAgKiBWaWVuZSBnZW5lcmF0byBsJ2hlYWRlciBlIGxhIHByb3ByaWV0w6AgcmVsYXRpdmEgYWwgdmFsb3JlIGZvcm1hdHRhdG8gbyBuby4gXHJcbiAgICogXHJcbiAgICogUGVyIG90dGVuZXJlIGlsIHZhbG9yZSBlIGwnaGVhZGVyIGRlbGxhIHByb3ByaWV0w6AgdmVuZ29ubyB1dGlsaXp6YXRpIGkgbmF2aWdhdG9yaSBhdXRvLWdlbmVyYXRpIG5lbCBkZWNvcmF0b3JlICoqRXhwb3J0QXMqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZU9iamVjdChvYmo6IGFueSwgcHJvcDogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGxvYz86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcclxuICAgIC8vc2UgcXVlc3RhIHByb3ByaWV0w6AgaGEgdW4gbmF2aWdhdG9yIHNpZ25pZmljYSBjaGUgZGVyaXZhIGRhIHVuIG9nZ2V0dG8gaW50ZXJubywgcmVjdXBlcm8gaWwgdmFsb3JlIGluIHF1ZXN0YSBmYXNlIGRhdG8gY2hlIHByaW1hIG5vbiBjZSBsJ2hvXHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yXTtcclxuXHJcbiAgICAvL0VzLiBkaSB2YWx1ZW5hdmlnYXRvciBvYmouc3Vib2JqLnN1YnN1Ym9iai5wcm9wZXJ0eVxyXG4gICAgbGV0IGptcHMgPSB2YWx1ZW5hdmlnYXRvci5zcGxpdChcIi5cIik7XHJcbiAgICAvL01pIGNsb25vIGwnb2dnZXR0byBvcmlnaW5hbGUgcGVyIG5vbiB1Y2NpZGVyZ2xpIGkgcmlmZXJpbWVudGlcclxuICAgIGxldCBjbG9uZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbiAgICAvL1NhbHRvIHJpY29yc2l2YW1lbnRlIHN1IG1lIHN0ZXNzbyBwZXIgYXJyaXZhcmUgYWxsYSBwcm9wcmlldMOgXHJcbiAgICAvL1NhbHRvIDEgPiBkaXZlbnRhIG9ialxyXG4gICAgLy9TYWx0byAyID4gZGl2ZW50YSBvYmouc3Vib2JqXHJcbiAgICAvL2VjYy4uLlxyXG4gICAgam1wcy5mb3JFYWNoKHBwID0+IHsgY2xvbmUgPSBjbG9uZVtwcF07IH0pO1xyXG5cclxuICAgIC8vVmFsb3JlIGZpbmFsZSA6RFxyXG4gICAgbGV0IHZhbHVlID0gY2xvbmU7XHJcblxyXG4gICAgbGV0IHRleHQgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgbGFiZWwgPSBsb2MgJiYgdGV4dCA/IGxvYy5sb2ModGV4dCkgOiB0ZXh0IHx8IFwiXCI7XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgLy9TZSBwZXIgcXVlc3RhIHByb3ByaWV0w6AgaG8gdW4gZm9ybWF0byBsbyBhcHBsaWNvXHJcbiAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSBvYmpbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyA9IFwic3RyaW5nXCI7XHJcbiAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgIGxldCB2YWwgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICB2YWx1ZSA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcbiAgICAgIHR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQodmFsdWUsIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgIHR5cGUgPSBcImRhdGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5OiBwcm9wLCBvcmRlciwgdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUxpc3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBsZXQgaGVhZGVybmF2aWdhdG9yID0gb2JqW3Byb3AgKyBsaXN0Q3N2SGRyUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgbGlzdENzdlZhbFByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVmb3JtYXQgPSBvYmpbcHJvcCArIGxpc3RDc3ZWYWxGb3JtYXRdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcblxyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gUGVyIGwnaGVhZGVyIHNpIGNvbnNpZGVyYSBhIHNlIHN0YW50ZSBvZ25pIHBlenpvIHNlcGFyYXRvIGRhIHNwYXppbyBwZXIgZmFyZSBsZSBjb25jYXRlbmF6aW9uaVxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBqdW1wcyA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLlwiKTtcclxuICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHRtcFJlcztcclxuXHJcbiAgICAgIGxldCB0eXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnID0gXCJzdHJpbmdcIjtcclxuICAgICAgaWYgKHZhbHVlZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICAgIHZhbHVlID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuICAgICAgICB0eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh2YWx1ZWZvcm1hdCkge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQob2JqW3Byb3BdLCB2YWx1ZWZvcm1hdC5sZW5ndGggPD0gMTAsIHZhbHVlZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICB0eXBlID0gXCJkYXRlXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AgKyBpZHgsIHsgdmFsdWU6IHZhbHVlID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleTogcHJvcCArIGlkeCwgb3JkZXI6IG9yZGVyICsgaWR4LCB0eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBsaXN0YSBkaSB2YWxvcmkgcGl2b3R0YXRpIGRpbmFtaWNhbWVudGU6XHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gaWwgdmFsb3JlIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGwnaGVhZGVyIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBpbCB2YWxvcmUgY2kgY3JlbyBsYSBwcm9wZXJ0eVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBsJ2hlYWRlciBlIGlsIHJpZmVyaW1lbnRvIGFsbGEgcHJvcGVydHkgYXBwZW5hIGNyZWF0YSBjcmVvIHVuIHJlY29yZCBuZWdsaSBoZWFkZXIgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZVxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VEaWN0aW9uYXJ5KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IGhlYWRlcm5hdmlnYXRvciA9IG9ialtwcm9wICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXhdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcbiAgICAgIHZhciBoZWFkZXJzcGxpdCA9IGhlYWRlcm5hdmlnYXRvci5zcGxpdChcIiBcIik7XHJcbiAgICAgIHZhciBsYWJlbCA9IFwiXCI7XHJcblxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgdmFsdWVzcGxpdCA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgdmFsdWVzcGxpdC5mb3JFYWNoKCh0LCBpZHhpbnRlcm5hbCkgPT4ge1xyXG4gICAgICAgIHZhciBuYXZpZyA9IHQuc3BsaXQoXCItXCIpWzFdO1xyXG4gICAgICAgIHZhciBkZXNjID0gdC5zcGxpdChcIi1cIilbMF07XHJcblxyXG4gICAgICAgIGp1bXBzID0gbmF2aWcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdG1wUmVzO1xyXG5cclxuICAgICAgICBsZXQgcHJvcG5hbWUgPSBwcm9wICsgaWR4LnRvU3RyaW5nKCkgKyBpZHhpbnRlcm5hbC50b1N0cmluZygpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BuYW1lLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWw6IGxhYmVsICsgXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2MoZGVzYykgOiBkZXNjLCBrZXk6IHByb3BuYW1lLCBvcmRlcjogb3JkZXIgKyBpZHgsIHR5cGU6ICdzdHJpbmcnLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgc2kgb2NjdXBhIGRlbGxhIGRlc2VyaWFsaXp6YXppb25lIGRlZ2xpIG9nZ2V0dGkgZGEgZXNwb3J0YXJlLiBNZXNzbyBhIGxpdmVsbG8gZGkgbGlicmVyaWEgaW4gbW9kbyBjaGUgcXVhbG9yYSBjaSBmb3NzZSBkYSBjYW1iaWFyZSBsaWJyZXJpYSBcclxuICAgKiB0dXR0ZSBsZSBtYW51dGVuemlvbmkgc2lhbm8gY29uY2VudHJhdGUgcXVpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBkZXNlcmlhbGl6emFyZVxyXG4gICAqIEBwYXJhbSB7YW55fSB0eXBlIFRpcG8gZGEgdXNhcmUgY29tZSBwcm90b3RpcG8gcGVyIGxhIGRlc2VyaWFsaXp6YXppb25lXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2FueX0gT2dnZXR0aSBkZXNlcmlhbGl6emF0aVxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXNlcmlhbGl6ZUZvckV4cG9ydChpdGVtczogYW55W10sIHR5cGU6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gRGVzZXJpYWxpemUoaXRlbXMsIHR5cGUpO1xyXG4gIH1cclxufSJdfQ==