@c8y/ngx-components 1018.0.191 → 1018.0.192

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.
@@ -1,17 +1,17 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { EventBinaryService, EventService, InventoryBinaryService, InventoryService, OperationService, OperationStatus, QueriesUtil } from '@c8y/client';
3
- import { AlertService, gettext, OperationRealtimeService } from '@c8y/ngx-components';
4
- import { assign, cloneDeep, find, forEach, get, head, isNil, isString, isUndefined, map as _map, omitBy, pick, remove, set } from 'lodash-es';
3
+ import { AlertService, gettext, GlobalConfigService, OperationRealtimeService } from '@c8y/ngx-components';
4
+ import { map as _map, assign, cloneDeep, find, forEach, get, head, isNil, isString, isUndefined, omitBy, pick, remove, set } from 'lodash-es';
5
5
  import { defer, from, merge, of, throwError } from 'rxjs';
6
6
  import { filter, map, switchMap, take, takeWhile, withLatestFrom } from 'rxjs/operators';
7
7
  import { AdvancedSoftwareService } from './advanced-software.service';
8
- import { RepositoryType, REPOSITORY_BINARY_TYPES } from './repository.model';
8
+ import { REPOSITORY_BINARY_TYPES, RepositoryType } from './repository.model';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@c8y/client";
11
11
  import * as i2 from "@c8y/ngx-components";
12
12
  import * as i3 from "./advanced-software.service";
13
13
  export class RepositoryService {
14
- constructor(inventory, inventoryBinary, operation, alert, event, operationRealtime, eventBinary, advancedSoftwareService) {
14
+ constructor(inventory, inventoryBinary, operation, alert, event, operationRealtime, eventBinary, advancedSoftwareService, globalConfigService) {
15
15
  this.inventory = inventory;
16
16
  this.inventoryBinary = inventoryBinary;
17
17
  this.operation = operation;
@@ -20,6 +20,7 @@ export class RepositoryService {
20
20
  this.operationRealtime = operationRealtime;
21
21
  this.eventBinary = eventBinary;
22
22
  this.advancedSoftwareService = advancedSoftwareService;
23
+ this.globalConfigService = globalConfigService;
23
24
  this.dateFrom = new Date(0);
24
25
  this.dateTo = new Date(Date.now() + 86400000); // 1 day in the future
25
26
  this.queriesUtil = new QueriesUtil();
@@ -59,50 +60,35 @@ export class RepositoryService {
59
60
  };
60
61
  return this.inventory.list(filters);
61
62
  }
62
- // TODO: merge with create()
63
- async save(data, type, mo = {}) {
63
+ async create(modal, type, mo = {}) {
64
64
  switch (type) {
65
- case RepositoryType.CONFIGURATION: {
66
- Object.assign(mo, {
67
- type: RepositoryType.CONFIGURATION,
68
- configurationType: data.selected ? data.selected.configurationType : undefined,
69
- name: data.version,
70
- description: data.description,
71
- deviceType: data.deviceType,
72
- c8y_Global: {}
65
+ case RepositoryType.FIRMWARE:
66
+ case RepositoryType.SOFTWARE:
67
+ return this.createRepositoryObject(modal, type);
68
+ case RepositoryType.CONFIGURATION:
69
+ Object.assign(modal, {
70
+ selected: {
71
+ id: modal.selected?.id || mo.id,
72
+ name: modal.version || modal.selected?.name
73
+ },
74
+ configurationType: modal.selected ? modal.selected.configurationType : undefined,
75
+ name: modal.version
73
76
  });
74
- if (!data.deviceType && mo.id) {
75
- mo.deviceType = null;
77
+ if (!modal.deviceType && mo.id) {
78
+ modal.deviceType = null;
76
79
  }
77
- if (!data.selected && mo.id) {
78
- mo.configurationType = null;
80
+ if (!modal.selected && mo.id) {
81
+ modal.configurationType = null;
79
82
  }
80
- break;
81
- }
82
- }
83
- const existingUrl = mo.url;
84
- if (data.binary.url) {
85
- mo.url = data.binary.url;
86
- }
87
- else if (data.binary.file) {
88
- const response = await this.inventoryBinary.create(data.binary.file, {
89
- c8y_Global: {}
90
- });
91
- mo.url = response.data.self;
92
- }
93
- if (mo.id) {
94
- return this.updateEntry(mo, existingUrl);
95
- }
96
- return this.createEntry(mo);
97
- }
98
- async create(modal, type) {
99
- switch (type) {
100
- case RepositoryType.FIRMWARE:
101
- case RepositoryType.SOFTWARE:
102
- return this.createFirmwareOrSoftware(modal, type);
83
+ const repositoryObject = this.createRepositoryObject(modal, type);
84
+ if (mo.url) {
85
+ const newBinaryUrl = (await repositoryObject).url;
86
+ this.removeOutdatedBinary(newBinaryUrl, mo.url);
87
+ }
88
+ return repositoryObject;
103
89
  }
104
90
  }
105
- async createFirmwareOrSoftware(modal, type) {
91
+ async createRepositoryObject(modal, type) {
106
92
  let binary;
107
93
  let binaryURL;
108
94
  let repositoryEntry;
@@ -110,22 +96,28 @@ export class RepositoryService {
110
96
  const mos = [];
111
97
  const { selected: { id: selectedId }, binary: { file, url } } = modal;
112
98
  try {
99
+ const globalParam = await this.getGlobalFragment(type);
113
100
  if (file) {
114
- ({ data: binary } = await this.saveBinary(file));
101
+ ({ data: binary } = await this.saveBinary(file, globalParam));
115
102
  ({ self: binaryURL } = binary);
103
+ if (type === RepositoryType.CONFIGURATION) {
104
+ modal.binary.url = binaryURL;
105
+ }
116
106
  mos.push(binary);
117
107
  }
118
108
  else {
119
109
  binaryURL = url;
120
110
  }
121
- ({ data: repositoryEntry } = await this.createOrUpdateRepositoryEntry(modal, type));
111
+ ({ data: repositoryEntry } = await this.createOrUpdateRepositoryEntry({ ...modal, ...globalParam }, type));
122
112
  if (isNil(selectedId)) {
123
113
  mos.push(repositoryEntry);
124
114
  }
125
- ({ data: repositoryBinary } = await this.createRepositoryBinary(modal, binaryURL, type, repositoryEntry));
126
- mos.push(repositoryBinary);
115
+ if (type !== RepositoryType.CONFIGURATION) {
116
+ ({ data: repositoryBinary } = await this.createRepositoryBinary({ ...modal, ...globalParam }, binaryURL, type, repositoryEntry));
117
+ mos.push(repositoryBinary);
118
+ }
127
119
  if (file) {
128
- await this.linkBinary(repositoryBinary, binary);
120
+ await this.linkBinary(repositoryBinary, binary, repositoryEntry);
129
121
  }
130
122
  return repositoryEntry;
131
123
  }
@@ -136,24 +128,33 @@ export class RepositoryService {
136
128
  throw error;
137
129
  }
138
130
  }
139
- saveBinary(file) {
140
- return this.inventoryBinary.create(file, { c8y_Global: {} });
131
+ saveBinary(file, global) {
132
+ return this.inventoryBinary.create(file, global);
141
133
  }
142
- createOrUpdateRepositoryEntry(modal, type) {
143
- const { selected: { id, name }, description, deviceType } = modal;
134
+ async createOrUpdateRepositoryEntry(modal, type) {
135
+ const { selected: { id, name }, description, deviceType, c8y_Global, binary } = modal;
144
136
  const mo = {
145
137
  id,
146
- name: id ? undefined : name,
138
+ name,
147
139
  description,
148
- type: id ? undefined : type,
149
- c8y_Global: {}
140
+ type,
141
+ c8y_Global
150
142
  };
151
- if (deviceType) {
143
+ if (deviceType && type !== RepositoryType.CONFIGURATION) {
152
144
  set(mo, 'c8y_Filter.type', deviceType);
153
145
  }
146
+ if (deviceType && type === RepositoryType.CONFIGURATION) {
147
+ set(mo, 'deviceType', deviceType);
148
+ }
154
149
  if (modal.softwareType) {
155
150
  set(mo, 'softwareType', modal.softwareType.softwareType);
156
151
  }
152
+ if (modal.configurationType) {
153
+ set(mo, 'configurationType', modal.configurationType);
154
+ }
155
+ if (type === RepositoryType.CONFIGURATION) {
156
+ set(mo, 'url', binary?.url);
157
+ }
157
158
  return id
158
159
  ? this.inventory.update(mo)
159
160
  : this.inventory.create(mo);
@@ -163,13 +164,13 @@ export class RepositoryService {
163
164
  return this.inventory.childAdditionsCreate(mo, parent);
164
165
  }
165
166
  prepareRepositoryBinaryMO(modal, binaryURL, type) {
166
- const { version, patchVersion, dependency } = modal;
167
+ const { version, patchVersion, dependency, c8y_Global } = modal;
167
168
  const result = {
168
169
  type: REPOSITORY_BINARY_TYPES[type],
169
170
  [type]: {
170
171
  url: binaryURL
171
172
  },
172
- c8y_Global: {}
173
+ c8y_Global
173
174
  };
174
175
  if (dependency) {
175
176
  set(result, [type, 'version'], patchVersion);
@@ -184,12 +185,16 @@ export class RepositoryService {
184
185
  }
185
186
  return result;
186
187
  }
187
- async linkBinary(repositoryBinary, binary) {
188
- const { id: repositoryBinaryId } = repositoryBinary;
189
- if (binary) {
190
- const { id: binaryId } = binary;
191
- return this.inventory.childAdditionsAdd(binaryId, repositoryBinaryId);
188
+ async linkBinary(repositoryBinary, binary, repositoryEntry) {
189
+ if (repositoryBinary) {
190
+ const { id: repositoryBinaryId } = repositoryBinary;
191
+ if (binary) {
192
+ const { id: binaryId } = binary;
193
+ return this.inventory.childAdditionsAdd(binaryId, repositoryBinaryId);
194
+ }
192
195
  }
196
+ else
197
+ return this.inventory.childAdditionsAdd(binary, repositoryEntry);
193
198
  }
194
199
  cleanUp(mosToDelete) {
195
200
  mosToDelete.forEach(mo => {
@@ -975,26 +980,6 @@ export class RepositoryService {
975
980
  }
976
981
  return res;
977
982
  }
978
- async createEntry(mo) {
979
- const binaryId = await this.inventoryBinary.getIdFromUrl(mo.url);
980
- const newMo = await this.inventory.create(mo);
981
- if (binaryId) {
982
- await this.inventory.childAdditionsAdd(binaryId, newMo.data);
983
- }
984
- return newMo;
985
- }
986
- async updateEntry(mo, url) {
987
- const existingBinaryId = await this.inventoryBinary.getIdFromUrl(url);
988
- const newBinaryId = await this.inventoryBinary.getIdFromUrl(mo.url);
989
- if (existingBinaryId && existingBinaryId !== newBinaryId) {
990
- const id = this.inventoryBinary.getIdFromUrl(url);
991
- await this.inventoryBinary.delete(id);
992
- }
993
- if (newBinaryId) {
994
- await this.inventory.childAdditionsAdd(newBinaryId, mo);
995
- }
996
- return this.inventory.update(mo);
997
- }
998
983
  getBaseVersionResultListForLegacyEntry(entry) {
999
984
  return Promise.resolve({
1000
985
  res: {},
@@ -1086,10 +1071,20 @@ export class RepositoryService {
1086
1071
  softwareListToLegacy(list) {
1087
1072
  return (list || []).reduce((prev, curr) => ({ ...prev, [curr.name]: curr.version }), {});
1088
1073
  }
1074
+ async getGlobalFragment(type) {
1075
+ return (await this.globalConfigService.getGlobalParam(type)) ? { c8y_Global: {} } : undefined;
1076
+ }
1077
+ async removeOutdatedBinary(newBinaryURL, oldBinaryURL) {
1078
+ const existingBinaryId = await this.inventoryBinary.getIdFromUrl(oldBinaryURL);
1079
+ const newBinaryId = await this.inventoryBinary.getIdFromUrl(newBinaryURL);
1080
+ if (existingBinaryId && existingBinaryId !== newBinaryId) {
1081
+ await this.inventoryBinary.delete(existingBinaryId);
1082
+ }
1083
+ }
1089
1084
  }
1090
- RepositoryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RepositoryService, deps: [{ token: i1.InventoryService }, { token: i1.InventoryBinaryService }, { token: i1.OperationService }, { token: i2.AlertService }, { token: i1.EventService }, { token: i2.OperationRealtimeService }, { token: i1.EventBinaryService }, { token: i3.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Injectable });
1085
+ RepositoryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RepositoryService, deps: [{ token: i1.InventoryService }, { token: i1.InventoryBinaryService }, { token: i1.OperationService }, { token: i2.AlertService }, { token: i1.EventService }, { token: i2.OperationRealtimeService }, { token: i1.EventBinaryService }, { token: i3.AdvancedSoftwareService }, { token: i2.GlobalConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
1091
1086
  RepositoryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RepositoryService });
1092
1087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RepositoryService, decorators: [{
1093
1088
  type: Injectable
1094
- }], ctorParameters: function () { return [{ type: i1.InventoryService }, { type: i1.InventoryBinaryService }, { type: i1.OperationService }, { type: i2.AlertService }, { type: i1.EventService }, { type: i2.OperationRealtimeService }, { type: i1.EventBinaryService }, { type: i3.AdvancedSoftwareService }]; } });
1095
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3NpdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zaGFyZWQvcmVwb3NpdG9yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBT1osc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUloQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFdBQVcsRUFDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULElBQUksRUFDSixPQUFPLEVBQ1AsR0FBRyxFQUNILElBQUksRUFDSixLQUFLLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxHQUFHLElBQUksSUFBSSxFQUNYLE1BQU0sRUFDTixJQUFJLEVBQ0osTUFBTSxFQUNOLEdBQUcsRUFDSixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBVUwsY0FBYyxFQUNkLHVCQUF1QixFQUd4QixNQUFNLG9CQUFvQixDQUFDOzs7OztBQUc1QixNQUFNLE9BQU8saUJBQWlCO0lBSzVCLFlBQ1UsU0FBMkIsRUFDM0IsZUFBdUMsRUFDdkMsU0FBMkIsRUFDM0IsS0FB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Q0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLENBQUM7OzhHQXB5Q1UsaUJBQWlCO2tIQUFqQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEV2ZW50QmluYXJ5U2VydmljZSxcbiAgRXZlbnRTZXJ2aWNlLFxuICBJZFJlZmVyZW5jZSxcbiAgSUV2ZW50LFxuICBJRmV0Y2hSZXNwb25zZSxcbiAgSUlkZW50aWZpZWQsXG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJTWFuYWdlZE9iamVjdEJpbmFyeSxcbiAgSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgSW52ZW50b3J5U2VydmljZSxcbiAgSU9wZXJhdGlvbixcbiAgSVJlc3VsdCxcbiAgSVJlc3VsdExpc3QsXG4gIE9wZXJhdGlvblNlcnZpY2UsXG4gIE9wZXJhdGlvblN0YXR1cyxcbiAgUXVlcmllc1V0aWxcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0LCBPcGVyYXRpb25SZWFsdGltZVNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIGFzc2lnbixcbiAgY2xvbmVEZWVwLFxuICBmaW5kLFxuICBmb3JFYWNoLFxuICBnZXQsXG4gIGhlYWQsXG4gIGlzTmlsLFxuICBpc1N0cmluZyxcbiAgaXNVbmRlZmluZWQsXG4gIG1hcCBhcyBfbWFwLFxuICBvbWl0QnksXG4gIHBpY2ssXG4gIHJlbW92ZSxcbiAgc2V0XG59IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBkZWZlciwgZnJvbSwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlV2hpbGUsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UgfSBmcm9tICcuL2FkdmFuY2VkLXNvZnR3YXJlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICBEZXZpY2VGaXJtd2FyZSxcbiAgRGV2aWNlU29mdHdhcmUsXG4gIERldmljZVNvZnR3YXJlQ2hhbmdlLFxuICBGaXJtd2FyZUJpbmFyeSxcbiAgRmlybXdhcmVQYXRjaEJpbmFyeSxcbiAgTW9kYWxNb2RlbCxcbiAgUmVwb3NpdG9yeUJpbmFyeSxcbiAgUmVwb3NpdG9yeUNhdGVnb3J5LFxuICBSZXBvc2l0b3J5VHlwZSxcbiAgUkVQT1NJVE9SWV9CSU5BUllfVFlQRVMsXG4gIFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeSxcbiAgU29mdHdhcmVCaW5hcnlcbn0gZnJvbSAnLi9yZXBvc2l0b3J5Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgZGF0ZUZyb20gPSBuZXcgRGF0ZSgwKTtcbiAgcmVhZG9ubHkgZGF0ZVRvID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKTsgLy8gMSBkYXkgaW4gdGhlIGZ1dHVyZVxuICBwcml2YXRlIHF1ZXJpZXNVdGlsOiBRdWVyaWVzVXRpbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeUJpbmFyeTogSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIG9wZXJhdGlvbjogT3BlcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudDogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3BlcmF0aW9uUmVhbHRpbWU6IE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50QmluYXJ5OiBFdmVudEJpbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhZHZhbmNlZFNvZnR3YXJlU2VydmljZTogQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5xdWVyaWVzVXRpbCA9IG5ldyBRdWVyaWVzVXRpbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHJlcG9zaXRvcnkgZW50cmllcyBvZiBnaXZlbiB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiByZXBvc2l0b3J5IGVudHJpZXMgdG8gbGlzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgRXh0cmEgbGlzdGluZyBvcHRpb25zLlxuICAgKi9cbiAgbGlzdFJlcG9zaXRvcnlFbnRyaWVzKFxuICAgIHR5cGU6IFJlcG9zaXRvcnlUeXBlLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICAvKiogQWRkaXRpb25hbCBxdWVyeS4gKi9cbiAgICAgIHF1ZXJ5PzogYW55O1xuICAgICAgLyoqIChkZXByZWNhdGVkIC0gdG8gYmUgcmVtb3ZlZCkgT25seSBpbmNsdWRlIGVudHJpZXMgd2l0aCBtYXRjaGluZyBwYXJ0aWFsIG5hbWVzLiAqL1xuICAgICAgcGFydGlhbE5hbWU/OiBzdHJpbmc7XG4gICAgICAvKiogSW5jbHVkZSBlbnRyaWVzIHdpdGggbWF0Y2hpbmcgcGFydGlhbCB0ZXh0IGluIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4gKi9cbiAgICAgIHBhcnRpYWxUZXh0RmlsdGVyPzogeyBwYXJ0aWFsVGV4dDogc3RyaW5nOyBwcm9wZXJ0aWVzOiBzdHJpbmdbXSB9O1xuICAgICAgLyoqIEV4Y2x1ZGUgbGVnYWN5IGVudHJpZXMuICovXG4gICAgICBza2lwTGVnYWN5PzogYm9vbGVhbjtcbiAgICAgIC8qKiBFeGNsdWRlIGRlZmF1bHQgb3JkZXJpbmcuICovXG4gICAgICBza2lwRGVmYXVsdE9yZGVyPzogYm9vbGVhbjtcbiAgICAgIC8qKiBPdGhlciByZXF1ZXN0IHBhcmFtcy4gKi9cbiAgICAgIHBhcmFtcz86IGFueTtcbiAgICB9XG4gICkge1xuICAgIGNvbnN0IGRlZmF1bHRPcmRlciA9IFt7IG5hbWU6IDEgfV07XG4gICAgY29uc3QgZGVmYXVsdEZpbHRlcnMgPSB7IHR5cGUgfTtcbiAgICBjb25zdCBsZWdhY3lGaWx0ZXJzID0geyBfX2hhczogYHVybGAgfTtcbiAgICBsZXQgZmlsdGVycyA9IHt9O1xuXG4gICAgbGV0IGZ1bGxRdWVyeSA9IChvcHRpb25zICYmIG9wdGlvbnMucXVlcnkpIHx8IHt9O1xuICAgIGlmICghb3B0aW9ucyB8fCAob3B0aW9ucyAmJiAhb3B0aW9ucy5za2lwRGVmYXVsdE9yZGVyKSkge1xuICAgICAgZnVsbFF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRPcmRlcmJ5cyhmdWxsUXVlcnksIGRlZmF1bHRPcmRlciwgJ3ByZXBlbmQnKTtcbiAgICB9XG5cbiAgICBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihmdWxsUXVlcnksIGRlZmF1bHRGaWx0ZXJzKTtcblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucGFydGlhbFRleHRGaWx0ZXIpIHtcbiAgICAgIGNvbnN0IHsgcGFydGlhbFRleHQsIHByb3BlcnRpZXMgfSA9IG9wdGlvbnMucGFydGlhbFRleHRGaWx0ZXI7XG4gICAgICBjb25zdCBvckZpbHRlciA9IHsgX19vcjogcHJvcGVydGllcy5tYXAocHJvcGVydHkgPT4gKHsgW3Byb3BlcnR5XTogYCoke3BhcnRpYWxUZXh0fSpgIH0pKSB9O1xuICAgICAgZnVsbFF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZnVsbFF1ZXJ5LCBvckZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wYXJ0aWFsTmFtZSkge1xuICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaWZcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKGZ1bGxRdWVyeSwgeyBuYW1lOiBgKiR7b3B0aW9ucy5wYXJ0aWFsTmFtZX0qYCB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNraXBMZWdhY3kpIHtcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKGZ1bGxRdWVyeSwgeyBfX25vdDogbGVnYWN5RmlsdGVycyB9KTtcbiAgICB9XG5cbiAgICBmaWx0ZXJzID0ge1xuICAgICAgcXVlcnk6IHRoaXMucXVlcmllc1V0aWwuYnVpbGRRdWVyeShmdWxsUXVlcnkpLFxuICAgICAgcGFnZVNpemU6IDUwLFxuICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWUsXG4gICAgICAuLi4oKG9wdGlvbnMgJiYgb3B0aW9ucy5wYXJhbXMpIHx8IHt9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5Lmxpc3QoZmlsdGVycyk7XG4gIH1cblxuICAvLyBUT0RPOiBtZXJnZSB3aXRoIGNyZWF0ZSgpXG4gIGFzeW5jIHNhdmUoZGF0YTogTW9kYWxNb2RlbCwgdHlwZTogUmVwb3NpdG9yeVR5cGUsIG1vOiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PiA9IHt9KSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT046IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtbywge1xuICAgICAgICAgIHR5cGU6IFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04sXG4gICAgICAgICAgY29uZmlndXJhdGlvblR5cGU6IGRhdGEuc2VsZWN0ZWQgPyBkYXRhLnNlbGVjdGVkLmNvbmZpZ3VyYXRpb25UeXBlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5hbWU6IGRhdGEudmVyc2lvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBkZXZpY2VUeXBlOiBkYXRhLmRldmljZVR5cGUsXG4gICAgICAgICAgYzh5X0dsb2JhbDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZGF0YS5kZXZpY2VUeXBlICYmIG1vLmlkKSB7XG4gICAgICAgICAgbW8uZGV2aWNlVHlwZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYXRhLnNlbGVjdGVkICYmIG1vLmlkKSB7XG4gICAgICAgICAgbW8uY29uZmlndXJhdGlvblR5cGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nVXJsID0gbW8udXJsO1xuICAgIGlmIChkYXRhLmJpbmFyeS51cmwpIHtcbiAgICAgIG1vLnVybCA9IGRhdGEuYmluYXJ5LnVybDtcbiAgICB9IGVsc2UgaWYgKGRhdGEuYmluYXJ5LmZpbGUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlCaW5hcnkuY3JlYXRlKGRhdGEuYmluYXJ5LmZpbGUsIHtcbiAgICAgICAgYzh5X0dsb2JhbDoge31cbiAgICAgIH0gYXMgUGFydGlhbDxJTWFuYWdlZE9iamVjdD4pO1xuICAgICAgbW8udXJsID0gcmVzcG9uc2UuZGF0YS5zZWxmO1xuICAgIH1cblxuICAgIGlmIChtby5pZCkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRW50cnkobW8sIGV4aXN0aW5nVXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRW50cnkobW8pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGFsOiBNb2RhbE1vZGVsLCB0eXBlOiBSZXBvc2l0b3J5VHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSZXBvc2l0b3J5VHlwZS5GSVJNV0FSRTpcbiAgICAgIGNhc2UgUmVwb3NpdG9yeVR5cGUuU09GVFdBUkU6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZpcm13YXJlT3JTb2Z0d2FyZShtb2RhbCwgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlRmlybXdhcmVPclNvZnR3YXJlKFxuICAgIG1vZGFsOiBNb2RhbE1vZGVsLFxuICAgIHR5cGU6IFJlcG9zaXRvcnlUeXBlXG4gICk6IFByb21pc2U8UmVwb3NpdG9yeUNhdGVnb3J5PiB7XG4gICAgbGV0IGJpbmFyeTogSU1hbmFnZWRPYmplY3RCaW5hcnk7XG4gICAgbGV0IGJpbmFyeVVSTDogc3RyaW5nO1xuICAgIGxldCByZXBvc2l0b3J5RW50cnk6IFJlcG9zaXRvcnlDYXRlZ29yeTtcbiAgICBsZXQgcmVwb3NpdG9yeUJpbmFyeTogRmlybXdhcmVCaW5hcnkgfCBTb2Z0d2FyZUJpbmFyeTtcbiAgICBjb25zdCBtb3MgPSBbXTtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZDogeyBpZDogc2VsZWN0ZWRJZCB9LFxuICAgICAgYmluYXJ5OiB7IGZpbGUsIHVybCB9XG4gICAgfSA9IG1vZGFsO1xuICAgIHRyeSB7XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICAoeyBkYXRhOiBiaW5hcnkgfSA9IGF3YWl0IHRoaXMuc2F2ZUJpbmFyeShmaWxlKSk7XG4gICAgICAgICh7IHNlbGY6IGJpbmFyeVVSTCB9ID0gYmluYXJ5KTtcbiAgICAgICAgbW9zLnB1c2goYmluYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpbmFyeVVSTCA9IHVybDtcbiAgICAgIH1cblxuICAgICAgKHsgZGF0YTogcmVwb3NpdG9yeUVudHJ5IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZU9yVXBkYXRlUmVwb3NpdG9yeUVudHJ5KG1vZGFsLCB0eXBlKSk7XG4gICAgICBpZiAoaXNOaWwoc2VsZWN0ZWRJZCkpIHtcbiAgICAgICAgbW9zLnB1c2gocmVwb3NpdG9yeUVudHJ5KTtcbiAgICAgIH1cblxuICAgICAgKHsgZGF0YTogcmVwb3NpdG9yeUJpbmFyeSB9ID0gYXdhaXQgdGhpcy5jcmVhdGVSZXBvc2l0b3J5QmluYXJ5KFxuICAgICAgICBtb2RhbCxcbiAgICAgICAgYmluYXJ5VVJMLFxuICAgICAgICB0eXBlLFxuICAgICAgICByZXBvc2l0b3J5RW50cnlcbiAgICAgICkpO1xuICAgICAgbW9zLnB1c2gocmVwb3NpdG9yeUJpbmFyeSk7XG5cbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlua0JpbmFyeShyZXBvc2l0b3J5QmluYXJ5LCBiaW5hcnkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVwb3NpdG9yeUVudHJ5O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNsZWFuVXAobW9zKTtcbiAgICAgIHRoaXMuZXJyb3JNc2coKTtcblxuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBzYXZlQmluYXJ5KGZpbGU6IEZpbGUpOiBQcm9taXNlPElSZXN1bHQ8SU1hbmFnZWRPYmplY3RCaW5hcnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5QmluYXJ5LmNyZWF0ZShmaWxlLCB7IGM4eV9HbG9iYWw6IHt9IH0gYXMgUGFydGlhbDxJTWFuYWdlZE9iamVjdD4pO1xuICB9XG5cbiAgY3JlYXRlT3JVcGRhdGVSZXBvc2l0b3J5RW50cnkoXG4gICAgbW9kYWw6IE1vZGFsTW9kZWwsXG4gICAgdHlwZTogUmVwb3NpdG9yeVR5cGVcbiAgKTogUHJvbWlzZTxJUmVzdWx0PFJlcG9zaXRvcnlDYXRlZ29yeT4+IHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZDogeyBpZCwgbmFtZSB9LFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBkZXZpY2VUeXBlXG4gICAgfSA9IG1vZGFsO1xuXG4gICAgY29uc3QgbW8gPSB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGlkID8gdW5kZWZpbmVkIDogbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgdHlwZTogaWQgPyB1bmRlZmluZWQgOiB0eXBlLFxuICAgICAgYzh5X0dsb2JhbDoge31cbiAgICB9O1xuXG4gICAgaWYgKGRldmljZVR5cGUpIHtcbiAgICAgIHNldChtbywgJ2M4eV9GaWx0ZXIudHlwZScsIGRldmljZVR5cGUpO1xuICAgIH1cblxuICAgIGlmIChtb2RhbC5zb2Z0d2FyZVR5cGUpIHtcbiAgICAgIHNldChtbywgJ3NvZnR3YXJlVHlwZScsIG1vZGFsLnNvZnR3YXJlVHlwZS5zb2Z0d2FyZVR5cGUpO1xuICAgIH1cblxuICAgIHJldHVybiBpZFxuICAgICAgPyAodGhpcy5pbnZlbnRvcnkudXBkYXRlKG1vKSBhcyBQcm9taXNlPElSZXN1bHQ8UmVwb3NpdG9yeUNhdGVnb3J5Pj4pXG4gICAgICA6ICh0aGlzLmludmVudG9yeS5jcmVhdGUobW8pIGFzIFByb21pc2U8SVJlc3VsdDxSZXBvc2l0b3J5Q2F0ZWdvcnk+Pik7XG4gIH1cblxuICBjcmVhdGVSZXBvc2l0b3J5QmluYXJ5KFxuICAgIG1vZGFsOiBNb2RhbE1vZGVsLFxuICAgIGJpbmFyeVVSTDogc3RyaW5nLFxuICAgIHR5cGU6IFJlcG9zaXRvcnlUeXBlLFxuICAgIHBhcmVudDogUmVwb3NpdG9yeUNhdGVnb3J5XG4gICk6IFByb21pc2U8SVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT4+IHtcbiAgICBjb25zdCBtbyA9IHRoaXMucHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbCwgYmluYXJ5VVJMLCB0eXBlKTtcblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0NyZWF0ZShtbywgcGFyZW50KSBhcyBQcm9taXNlPFxuICAgICAgSVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT5cbiAgICA+O1xuICB9XG5cbiAgcHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbDogTW9kYWxNb2RlbCwgYmluYXJ5VVJMOiBzdHJpbmcsIHR5cGU6IFJlcG9zaXRvcnlUeXBlKSB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBwYXRjaFZlcnNpb24sIGRlcGVuZGVuY3kgfSA9IG1vZGFsO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHR5cGU6IFJFUE9TSVRPUllfQklOQVJZX1RZUEVTW3R5cGVdLFxuICAgICAgW3R5cGVdOiB7XG4gICAgICAgIHVybDogYmluYXJ5VVJMXG4gICAgICB9LFxuICAgICAgYzh5X0dsb2JhbDoge31cbiAgICB9O1xuXG4gICAgaWYgKGRlcGVuZGVuY3kpIHtcbiAgICAgIHNldChyZXN1bHQsIFt0eXBlLCAndmVyc2lvbiddLCBwYXRjaFZlcnNpb24pO1xuICAgICAgYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBjOHlfUGF0Y2g6IHtcbiAgICAgICAgICBkZXBlbmRlbmN5OiBkZXBlbmRlbmN5LmM4eV9GaXJtd2FyZS52ZXJzaW9uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQocmVzdWx0LCBbdHlwZSwgJ3ZlcnNpb24nXSwgdmVyc2lvbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBsaW5rQmluYXJ5KFxuICAgIHJlcG9zaXRvcnlCaW5hcnk6IEZpcm13YXJlQmluYXJ5IHwgU29mdHdhcmVCaW5hcnksXG4gICAgYmluYXJ5OiBJTWFuYWdlZE9iamVjdEJpbmFyeVxuICApIHtcbiAgICBjb25zdCB7IGlkOiByZXBvc2l0b3J5QmluYXJ5SWQgfSA9IHJlcG9zaXRvcnlCaW5hcnk7XG4gICAgaWYgKGJpbmFyeSkge1xuICAgICAgY29uc3QgeyBpZDogYmluYXJ5SWQgfSA9IGJpbmFyeTtcbiAgICAgIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0FkZChiaW5hcnlJZCwgcmVwb3NpdG9yeUJpbmFyeUlkKTtcbiAgICB9XG4gIH1cblxuICBjbGVhblVwKG1vc1RvRGVsZXRlOiBJSWRlbnRpZmllZFtdKSB7XG4gICAgbW9zVG9EZWxldGUuZm9yRWFjaChtbyA9PiB7XG4gICAgICBjb25zdCB7IGM4eV9Jc0JpbmFyeSB9ID0gbW87XG4gICAgICBpc1VuZGVmaW5lZChjOHlfSXNCaW5hcnkpID8gdGhpcy5kZWxldGUobW8pIDogdGhpcy5pbnZlbnRvcnlCaW5hcnkuZGVsZXRlKG1vKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShlbnRpdHk6IElJZGVudGlmaWVkKTogUHJvbWlzZTxJUmVzdWx0PG51bGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5LmRlbGV0ZShlbnRpdHksIHsgZm9yY2VDYXNjYWRlOiB0cnVlIH0pO1xuICB9XG5cbiAgZXJyb3JNc2coKSB7XG4gICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnRmFpbGVkIHRvIHNhdmUnKTtcbiAgICB0aGlzLmFsZXJ0LmRhbmdlcihtc2cpO1xuICB9XG5cbiAgZ2V0QmFzZVZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBvZigxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20odGhpcy5saXN0QmFzZVZlcnNpb25zKGVudHJ5LCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KSkucGlwZShcbiAgICAgIG1hcCgoeyBwYWdpbmcgfSkgPT4gcGFnaW5nLnRvdGFsUGFnZXMpXG4gICAgKTtcbiAgfVxuXG4gIGdldEJhc2VWZXJzaW9uRnJvbU1PKG1vOiBSZXBvc2l0b3J5QmluYXJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGNoKG1vKSA/IGdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5JykgOiBnZXQobW8sICdjOHlfRmlybXdhcmUudmVyc2lvbicpO1xuICB9XG5cbiAgaXNQYXRjaChtbzogUmVwb3NpdG9yeUJpbmFyeSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5Jyk7XG4gIH1cblxuICBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCwgYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5pc0xlZ2FjeUVudHJ5KGJhc2VWZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIG9mKDApO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMubGlzdFBhdGNoVmVyc2lvbnMoZW50cnksIGJhc2VWZXJzaW9uLCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KVxuICAgICkucGlwZShtYXAoKHsgcGFnaW5nIH0pID0+IHBhZ2luZy50b3RhbFBhZ2VzKSk7XG4gIH1cblxuICBpc0xlZ2FjeUVudHJ5KGVudHJ5OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKGVudHJ5LnVybCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYWxsIHZlcnNpb25zIChiYXNlIGFuZCBwYXRjaCBvbmVzKSBvZiBnaXZlbiB0b3AgbGV2ZWwgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RBbGxWZXJzaW9ucyhlbnRyeTogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4sIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJhc2VWZXJzaW9uUmVzdWx0TGlzdEZvckxlZ2FjeUVudHJ5KGVudHJ5KTtcbiAgICB9XG5cbiAgICBjb25zdCBWRVJTSU9OX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7fSxcbiAgICAgIF9fb3JkZXJieTogW3sgJ2NyZWF0aW9uVGltZS5kYXRlJzogLTEgfSwgeyBjcmVhdGlvblRpbWU6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIFZFUlNJT05fRklMVEVSX09SREVSLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIGJhc2UgdmVyc2lvbnMgb2YgZ2l2ZW4gdG9wIGxldmVsIGVudHJ5LlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBAcGFyYW0gZW50cnkgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkuXG4gICAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBxdWVyeSBwYXJhbXMuXG4gICAqL1xuICBsaXN0QmFzZVZlcnNpb25zKGVudHJ5OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PiwgcGFyYW1zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0xlZ2FjeUVudHJ5KGVudHJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QmFzZVZlcnNpb25SZXN1bHRMaXN0Rm9yTGVnYWN5RW50cnkoZW50cnkpO1xuICAgIH1cblxuICAgIGNvbnN0IE5PX1BBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIF9fbm90OiB7IF9faGFzOiAnYzh5X1BhdGNoJyB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyAnY3JlYXRpb25UaW1lLmRhdGUnOiAtMSB9LCB7IGNyZWF0aW9uVGltZTogLTEgfV1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpc3RDaGlsZHJlbihlbnRyeSwgTk9fUEFUQ0hfRklMVEVSX09SREVSLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHBhdGNoIHZlcnNpb25zIG9mIGdpdmVuIGJhc2UgdmVyc2lvbiB1bmRlciB0aGUgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIGJhc2VWZXJzaW9uIEJhc2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RQYXRjaFZlcnNpb25zKGVudHJ5OiBJTWFuYWdlZE9iamVjdCwgYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5IHwgc3RyaW5nLCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IHZlcnNpb24gPSBpc1N0cmluZyhiYXNlVmVyc2lvbikgPyBiYXNlVmVyc2lvbiA6IGdldChiYXNlVmVyc2lvbiwgJ2M4eV9GaXJtd2FyZS52ZXJzaW9uJyk7XG4gICAgY29uc3QgUEFUQ0hfRklMVEVSX09SREVSID0ge1xuICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5JzogdmVyc2lvblxuICAgICAgfSxcbiAgICAgIF9fb3JkZXJieTogW3sgJ2NyZWF0aW9uVGltZS5kYXRlJzogLTEgfSwgeyBjcmVhdGlvblRpbWU6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIFBBVENIX0ZJTFRFUl9PUkRFUiwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBwYXRjaCB2ZXJzaW9ucyBvZiBnaXZlbiBiYXNlIHZlcnNpb24gdW5kZXIgdGhlIGVudHJ5IGluY2x1ZGluZyB0aGUgYmFzZSB2ZXJzaW9uLlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBJbiB0ZXJtcyBvZiBsZWdhY3kgYmFzZSB2ZXJzaW9uIHRoZSBlbnRyeSBnZXRzIHRyYW5zZm9ybWVkIHRvIGZpdCB0aGUgbmVlZGVkIGRhdGEgbW9kZWwuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIGJhc2VWZXJzaW9uIEJhc2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RCYXNlVmVyc2lvbkFuZFBhdGNoZXMoZW50cnk6IElNYW5hZ2VkT2JqZWN0LCBiYXNlVmVyc2lvbjogSU1hbmFnZWRPYmplY3QsIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYzh5X0Zpcm13YXJlOiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvbixcbiAgICAgICAgICAgICAgICB1cmw6IGVudHJ5LnVybFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IFBBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIF9fb3I6IHtcbiAgICAgICAgICAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbixcbiAgICAgICAgICAnYzh5X0Zpcm13YXJlLnZlcnNpb24nOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiAxIH0sIHsgJ2M4eV9GaXJtd2FyZS52ZXJzaW9uJzogMSB9XVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGlzdENoaWxkcmVuKGVudHJ5LCBQQVRDSF9GSUxURVJfT1JERVIsIHBhcmFtcyk7XG4gIH1cblxuICBsaXN0Q2hpbGRyZW4oZW50cnk6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LCBmaWx0ZXJzID0ge30sIHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb25zdCBjaGlsZHJlbkZpbHRlcnMgPSB7IF9fYnlncm91cGlkOiBlbnRyeS5pZCB9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZmlsdGVycywgY2hpbGRyZW5GaWx0ZXJzKTtcbiAgICAvLyBGSVhNRTogbmVlZGVkIGJlY2F1c2Ugb2YgaXNzdWUgaW4gZm9yT2YgZGlyZWN0aXZlICguLi4pXG4gICAgcGFyYW1zLndpdGhUb3RhbFBhZ2VzID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkubGlzdFF1ZXJ5KHF1ZXJ5LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYWxsIGl0ZW1zIGZyb20gdGhlIGxpc3Qgc3RhcnRpbmcgd2l0aCB0aGUgcHJvdmlkZWQgcGFnZS5cbiAgICogQHBhcmFtIGZpcnN0UGFnZSBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgbGlzdCB0byBmZXRjaCBhbGwgaXRlbXMgZm9yLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBbGxJdGVtc0Zyb21MaXN0KGZpcnN0UGFnZSkge1xuICAgIGxldCBhbGxJdGVtcztcblxuICAgIGlmICghZmlyc3RQYWdlLnRoZW4pIHtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLmZpcnN0UGFnZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IHBhZ2luZywgZGF0YTogaXRlbXMgfSA9IGF3YWl0IGZpcnN0UGFnZTtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLml0ZW1zXTtcblxuICAgICAgd2hpbGUgKHBhZ2luZyAmJiBwYWdpbmcubmV4dFBhZ2UpIHtcbiAgICAgICAgKHsgcGFnaW5nLCBkYXRhOiBpdGVtcyB9ID0gYXdhaXQgcGFnaW5nLm5leHQoKSk7XG4gICAgICAgIGFsbEl0ZW1zID0gWy4uLmFsbEl0ZW1zLCAuLi5pdGVtc107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgbWFuYWdlZCBvYmplY3QgZm9yIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbi5cbiAgICogQHBhcmFtIG1vIEJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdCB3aXRoIHBhcmVudHMuXG4gICAqL1xuICBnZXRSZXBvc2l0b3J5RW50cnlNTyQobW86IElNYW5hZ2VkT2JqZWN0KTogT2JzZXJ2YWJsZTxJTWFuYWdlZE9iamVjdCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghbW8pIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgICBjb25zdCBbcmVmZXJlbmNlXSA9IGdldChtbywgJ2FkZGl0aW9uUGFyZW50cy5yZWZlcmVuY2VzJyk7XG4gICAgY29uc3QgaWQgPSBnZXQocmVmZXJlbmNlLCAnbWFuYWdlZE9iamVjdC5pZCcpO1xuICAgIHJldHVybiBpZFxuICAgICAgPyBmcm9tKHRoaXMuaW52ZW50b3J5LmRldGFpbChpZCwgeyB3aXRoQ2hpbGRyZW46IGZhbHNlIH0pKS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxuICAgICAgOiBvZih1bmRlZmluZWQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdC5cbiAgICogQHBhcmFtIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudCBEZXZpY2UgcmVwb3NpdG9yeSBmcmFnbWVudC5cbiAgICogQHBhcmFtIHR5cGUgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgdHlwZS5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBvYmplY3Qgd2l0aCBvcHRpb25zOlxuICAgKiAtICoqc2tpcExlZ2FjeSoqIC0gYGJvb2xlYW5gIC0gRXhjbHVkZSBsZWdhY3kgZW50cmllcy5cbiAgICogLSAqKmZpbHRlcnMqKiAtIGBvYmplY3RgIC0gRmlsdGVyIG9iamVjdC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgYXMgaXQgZG9lc24ndCBzdXBwb3J0ICdtaXNzaW5nIHVybCcgY2FzZVxuICAgKi9cbiAgZ2V0UmVwb3NpdG9yeUJpbmFyeU1vQnlWZXJzaW9uKFxuICAgIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudDogRGV2aWNlRmlybXdhcmUgfCBEZXZpY2VTb2Z0d2FyZSxcbiAgICB0eXBlOiBSZXBvc2l0b3J5VHlwZSxcbiAgICB7IHNraXBMZWdhY3kgPSBmYWxzZSwgZmlsdGVycyA9IHt9IH06IHsgc2tpcExlZ2FjeT86IGJvb2xlYW47IGZpbHRlcnM/OiBvYmplY3QgfSA9IHt9XG4gICk6IFByb21pc2U8SU1hbmFnZWRPYmplY3Q+IHtcbiAgICBjb25zdCB7IHZlcnNpb24sIHVybCwgbmFtZSB9ID0gZGV2aWNlUmVwb3NpdG9yeUZyYWdtZW50O1xuICAgIGNvbnN0IHJlcG9zaXRvcnlCaW5hcnlUeXBlID0gUkVQT1NJVE9SWV9CSU5BUllfVFlQRVNbdHlwZV07XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGNvbnN0IG5ld01vZGVsQmFzZVZlcnNpb25RdWVyeSA9IHtcbiAgICAgIFtgJHt0eXBlfS52ZXJzaW9uYF06IHZlcnNpb24sXG4gICAgICBbYCR7dHlwZX0udXJsYF06IHVybCxcbiAgICAgIHR5cGU6IHJlcG9zaXRvcnlCaW5hcnlUeXBlXG4gICAgfTtcbiAgICBjb25zdCBsZWdhY3lWZXJzaW9uUXVlcnkgPSB7IHVybCwgdHlwZSwgbmFtZSB9O1xuICAgIGZpbHRlcnMgPSB7IHdpdGhDaGlsZHJlbjogZmFsc2UsIHdpdGhQYXJlbnRzOiB0cnVlLCAuLi5maWx0ZXJzIH07XG5cbiAgICBpZiAoc2tpcExlZ2FjeSkge1xuICAgICAgcXVlcnkgPSB7XG4gICAgICAgIF9fYW5kOiB7XG4gICAgICAgICAgLi4ubmV3TW9kZWxCYXNlVmVyc2lvblF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICBfX29yOiBbeyBfX2FuZDogeyAuLi5uZXdNb2RlbEJhc2VWZXJzaW9uUXVlcnkgfSB9LCB7IF9fYW5kOiB7IC4uLmxlZ2FjeVZlcnNpb25RdWVyeSB9IH1dXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5saXN0UXVlcnkocXVlcnksIGZpbHRlcnMpLnRoZW4oKHsgZGF0YSB9KSA9PiBoZWFkKGRhdGEpKTtcbiAgfVxuXG4gIGdldEJpbmFyeU5hbWUkKGJpbmFyeVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoIWJpbmFyeVVybCkge1xuICAgICAgcmV0dXJuIG9mKCctLS0nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5hcnlJZCA9IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybChiaW5hcnlVcmwpO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIHJldHVybiBvZihiaW5hcnlVcmwpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmZXIoKCkgPT4gdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpLnBpcGUoXG4gICAgICBtYXAobW8gPT4gbW8ubmFtZSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBpbnZlbnRvcnkgcXVlcnkgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmRcbiAgICogcmVwb3NpdG9yeSBlbnRyaWVzIG9mIHNwZWNpZmllZCB0eXBlIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHByb3ZpZGVkIGRldmljZS5cbiAgICogQHBhcmFtIHJlcG9zaXRvcnlUeXBlIFRoZSB0eXBlIG9mIHJlcG9zaXRvcnkgZW50cmllcyB3aGljaCB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cblxuICBnZXREZXZpY2VUeXBlUXVlcnkocmVwb3NpdG9yeVR5cGU6IFJlcG9zaXRvcnlUeXBlLCBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyB0eXBlOiByZXBvc2l0b3J5VHlwZSB9O1xuICAgIGlmIChyZXBvc2l0b3J5VHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgaWYgKGRldmljZS50eXBlKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHJlc3VsdCwge1xuICAgICAgICAgIF9fb3I6IFt7IGRldmljZVR5cGU6IGRldmljZS50eXBlIH0sIHsgX19ub3Q6IHsgX19oYXM6IGBkZXZpY2VUeXBlYCB9IH1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihyZXN1bHQsIHtcbiAgICAgICAgX19vcjogW1xuICAgICAgICAgIHsgJ2M4eV9GaWx0ZXIudHlwZSc6IGRldmljZS50eXBlIH0sXG4gICAgICAgICAgeyAnYzh5X0ZpbHRlci50eXBlJzogJycgfSxcbiAgICAgICAgICB7IF9fbm90OiB7IF9faGFzOiBgYzh5X0ZpbHRlci50eXBlYCB9IH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gaW52ZW50b3J5IHF1ZXJ5IG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaW5kXG4gICAqIHJlcG9zaXRvcnkgZW50cmllcyBtYXRjaGluZyB0aGUgcHJlZGVmaW5lZCBzb2Z0d2FyZSB0eXBlcyBwcm92aWRlZCBpbiB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHdoaWNoIHRoZSBzb2Z0d2FyZSB0eXBlcyBmaWx0ZXJzIHdpbGwgYmUgYXR0YWNoZWQuIERlZmF1bHQgdmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5nIHJlcG9zaXRvcnkgdHlwZSBzb2Z0d2FyZS5cbiAgICovXG4gIGdldFNvZnR3YXJlVHlwZVF1ZXJ5KGRldmljZTogSU1hbmFnZWRPYmplY3QsIHF1ZXJ5Pzogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyAuLi4ocXVlcnkgfHwge30pLCB0eXBlOiBSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSB9O1xuXG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkU29mdHdhcmVUeXBlcykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIocmVzdWx0LCB7XG4gICAgICAgIF9fb3I6IFtkZXZpY2UuYzh5X1N1cHBvcnRlZFNvZnR3YXJlVHlwZXMubWFwKHR5cGUgPT4gKHsgc29mdHdhcmVUeXBlOiB0eXBlIH0pKV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuIGludmVudG9yeSBxdWVyeSBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBjb25maWd1cmF0aW9uIHJlcG9zaXRvcnkgZW50cmllc1xuICAgKiBtYXRjaGluZyB0aGUgdHlwZSBvZiBwcm92aWRlZCBkZXZpY2UgYW5kIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSBlbnRyaWVzIHdpbGwgYmUgcXVlcmllZCB3aXRoIHRoZSBnZW5lcmF0ZWQgcXVlcnkuXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uVHlwZSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nKTogb2JqZWN0IHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0RGV2aWNlVHlwZVF1ZXJ5KFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04sIGRldmljZSk7XG4gICAgcmV0dXJuIHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHF1ZXJ5LCB7XG4gICAgICBfX29yOiBbXG4gICAgICAgIHsgY29uZmlndXJhdGlvblR5cGUgfSxcbiAgICAgICAgeyBjb25maWd1cmF0aW9uVHlwZTogJycgfSxcbiAgICAgICAgeyBfX25vdDogeyBfX2hhczogYGNvbmZpZ3VyYXRpb25UeXBlYCB9IH1cbiAgICAgIF1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNvZnR3YXJlIGluc3RhbGxlZCBpbiB0aGUgZGV2aWNlIGluIHRoZSB1bmlmb3JtIGZvcm1hdC5cbiAgICogU3VwcG9ydHMgYzh5X1NvZnR3YXJlTGlzdCBhbmQgYzh5X1NvZnR3YXJlIGZyYWdtZW50cy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIHdob3NlIHNvZnR3YXJlIGxpc3Qgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKi9cbiAgZ2V0RGV2aWNlU29mdHdhcmVMaXN0KGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBEZXZpY2VTb2Z0d2FyZVtdIHtcbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSkge1xuICAgICAgcmV0dXJuIF9tYXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSwgKHZlcnNpb24sIG5hbWUpID0+ICh7IG5hbWUsIHZlcnNpb24gfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBsaXN0IG9mIGNoYW5nZXMsIGFuZCBzZW5kcyBpdCB0byB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2Ugd2hpY2ggdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGFuZCBzZW50IHRvLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgc29mdHdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjaGFuZ2VzLlxuICAgKiBSZXR1cm5lZCBvcGVyYXRpb24gdHlwZSBkZXBlbmRzIG9uIGRldmljZSdzIHN1cHBvcnRlZCBvcGVyYXRpb25zLlxuICAgKiBTdXBwb3J0cyBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIGFuZCBjOHlfU29mdHdhcmUgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbjogSU9wZXJhdGlvbiA9IHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYEFwcGx5IHNvZnR3YXJlIGNoYW5nZXM6ICR7Y2hhbmdlc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIGNoYW5nZSA9PlxuICAgICAgICAgICAgYCR7Y2hhbmdlLmFjdGlvbn0gXCIke2NoYW5nZS5uYW1lfVwiJHtcbiAgICAgICAgICAgICAgY2hhbmdlLnZlcnNpb24gPyBgICh2ZXJzaW9uOiAke2NoYW5nZS52ZXJzaW9ufSlgIDogJydcbiAgICAgICAgICAgIH1gXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgIH07XG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlVXBkYXRlJykpIHtcbiAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUgPSAoY2xvbmVEZWVwKGNoYW5nZXMpIHx8IFtdKS5tYXAoY2hhbmdlID0+XG4gICAgICAgIG9taXRCeShjaGFuZ2UsIGlzTmlsKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlTGlzdCcpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCA9IGNsb25lRGVlcChcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRDdXJyZW50U29mdHdhcmUoZGV2aWNlLCAnYzh5X1NvZnR3YXJlTGlzdCcsIFtdKVxuICAgICAgKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZTogRGV2aWNlU29mdHdhcmUgPSBwaWNrKG9taXRCeShjaGFuZ2UsIGlzTmlsKSwgW1xuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgJ3NvZnR3YXJlVHlwZSdcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICAgIHJlbW92ZShvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBjb25zdCBzb2Z0d2FyZUl0ZW1Ub1VwZGF0ZUlkeCA9IG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5uYW1lID09PSBjaGFuZ2UubmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBzb2Z0d2FyZVxuICAgICAgICAgICAgb3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZUxpc3Quc3BsaWNlKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4LCAxLCBkZXZpY2VTb2Z0d2FyZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc3RhbGwgc29mdHdhcmVcbiAgICAgICAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LnB1c2goZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChkZXZpY2UuYzh5X1N1cHBvcnRlZE9wZXJhdGlvbnMuaW5jbHVkZXMoJ2M4eV9Tb2Z0d2FyZScpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlID0gY2xvbmVEZWVwKGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZScsIHt9KSk7XG4gICAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZS5hY3Rpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgZGVsZXRlIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVbY2hhbmdlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlW2NoYW5nZS5uYW1lXSA9IGNoYW5nZS52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgbGlzdCBvZiBkZXZpY2Ugc29mdHdhcmUgY2hhbmdlcyBmcm9tIGdpdmVuIG9wZXJhdGlvbiBpbiB0aGUgY29udGV4dCBvZiBnaXZlbiBkZXZpY2UuXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBmcm9tIHdoaWNoIHRoZSBsaXN0IHNob3VsZCBiZSBleHRyYWN0ZWQuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIHRhcmdldCBkZXZpY2Ugb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21PcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uLFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPiB7XG4gICAgaWYgKG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAob3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZVVwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlU29mdHdhcmVDaGFuZ2VzRnJvbVNvZnR3YXJlTGlzdE9wZXJhdGlvbihvcGVyYXRpb24sIGRldmljZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VTb2Z0d2FyZUNoYW5nZXNGcm9tU29mdHdhcmVPcGVyYXRpb24ob3BlcmF0aW9uLCBkZXZpY2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBmaXJtd2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBzZWxlY3RlZCByZXBvc2l0b3J5IGJpbmFyeSwgYW5kIHNlbmRzIGl0IHRvIHRoZSBkZXZpY2UuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB3aGljaCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYW5kIHNlbnQgdG8uXG4gICAqIEBwYXJhbSBzZWxlY3RlZE9wdGlvbiBUaGUgc2VsZWN0ZWQgcmVwb3NpdG9yeSBiaW5hcnkgb3B0aW9uLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRmlybXdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBzZWxlY3RlZE9wdGlvbjogU2VsZWN0ZWRSZXBvc2l0b3J5QmluYXJ5XG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZ2V0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBzZWxlY3RlZE9wdGlvbik7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLm9wZXJhdGlvbi5jcmVhdGUob3BlcmF0aW9uKSkuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGZpcm13YXJlIHVwZGF0ZSBvcGVyYXRpb24gZm9yIGdpdmVuIGRldmljZSBhbmQgc2VsZWN0ZWQgdmVyc2lvbi5cbiAgICogU3VwcG9ydHMgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRPcHRpb24gU2VsZWN0ZWQgZmlybXdhcmUgdmVyc2lvbi5cbiAgICovXG4gIGdldEZpcm13YXJlVXBkYXRlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgc2VsZWN0ZWRPcHRpb246IFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBkZWxldGUgc2VsZWN0ZWRPcHRpb24uaWQ7XG5cbiAgICBjb25zdCBvcGVyYXRpb246IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGBVcGRhdGUgZmlybXdhcmUgdG86IFwiJHtzZWxlY3RlZE9wdGlvbi5uYW1lfVwiJHtcbiAgICAgICAgc2VsZWN0ZWRPcHRpb24udmVyc2lvbiA/IGAgKHZlcnNpb246ICR7c2VsZWN0ZWRPcHRpb24udmVyc2lvbn0pYCA6ICcnXG4gICAgICB9YCxcbiAgICAgIGM4eV9GaXJtd2FyZTogeyAuLi5zZWxlY3RlZE9wdGlvbiB9XG4gICAgfTtcblxuICAgIHJldHVybiBvcGVyYXRpb247XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgdXBsb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGlzTGVnYWN5ICBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXRVcGxvYWRDb25maWd1cmF0aW9uRmlsZU9wZXJhdGlvbihcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbmZpZ3VyYXRpb25UeXBlOiBzdHJpbmcsXG4gICAgaXNMZWdhY3kgPSBmYWxzZVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBpZiAoaXNMZWdhY3kpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmV0cmlldmUgY29uZmlndXJhdGlvbiBzbmFwc2hvdCBmcm9tIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9VcGxvYWRDb25maWdGaWxlOiB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFJldHJpZXZlICR7Y29uZmlndXJhdGlvblR5cGV9IGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZnJvbSBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X1VwbG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgY29uZmlndXJhdGlvbiBmaWxlIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgdXJsIG9mIGEgYmluYXJ5IHRvIGJlIGRvd25sb2FkZWQuXG4gICAqIEBwYXJhbSBpc0xlZ2FjeSBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXREb3dubG9hZENvbmZpZ3VyYXRpb25GaWxlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgY29uZmlndXJhdGlvblR5cGU6IHN0cmluZyxcbiAgICBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICAgIGlzTGVnYWN5ID0gZmFsc2VcbiAgKTogSU9wZXJhdGlvbiB7XG4gICAgaWYgKGlzTGVnYWN5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IHRvIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9Eb3dubG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgICBjOHlfQ29uZmlndXJhdGlvbkR1bXA6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWdTbmFwc2hvdC5pZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IG9mIGNvbmZpZ3VyYXRpb24gdHlwZSAke2NvbmZpZ3VyYXRpb25UeXBlfSB0byBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X0Rvd25sb2FkQ29uZmlnRmlsZToge1xuICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgZmlybXdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSBkZXZpY2VJZCBUaGUgSUQgb2YgdGhlIGRldmljZSB0byBmaW5kIGFuIG9wZXJhdGlvbiBmb3IuXG4gICAqL1xuICBhc3luYyBnZXRMYXN0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLFxuICAgICAgcmV2ZXJ0OiB0cnVlLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oW3sgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X0Zpcm13YXJlJyB9XSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UuXG4gICAqIExvb2tzIGZvciBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIG9yIGM4eV9Tb2Z0d2FyZSBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdFNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uKGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPElPcGVyYXRpb24+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBkYXRlRnJvbTogbmV3IERhdGUoMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAxXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXRlc3RNYXRjaGluZ09wZXJhdGlvbihbXG4gICAgICB7IC4uLmZpbHRlcnMsIGZyYWdtZW50VHlwZTogJ2M4eV9Tb2Z0d2FyZVVwZGF0ZScgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlTGlzdCcgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciB0aGUgbGlzdCBvZiBmaWx0ZXJzIGFuZCBxdWVyaWVzIHRoZSBvcGVyYXRpb25zLlxuICAgKiBJZiBhIHF1ZXJ5IHJldHVybnMgYXQgbGVhc3Qgb25lIG9wZXJhdGlvbiwgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLlxuICAgKiBPdGhlcndpc2UgdGhlIG5leHQgcXVlcnkgd2lsbCBiZSBwZXJmb3JtZWQuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oZmlsdGVyc0xpc3Q6IGFueVtdKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgbGV0IG1hdGNoaW5nT3BlcmF0aW9uID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZmlsdGVycyBvZiBmaWx0ZXJzTGlzdCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID0gb3BlcmF0aW9uc1swXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGxpc3Qgb2YgZmlsdGVycyBhbmQgcXVlcmllcyB0aGUgb3BlcmF0aW9ucy5cbiAgICogSXQgY29tcGFyZXMgdGhlIG9wZXJhdGlvbnMgcmV0cmlldmVkIGJ5IHRoZSBxdWVyaWVzIGJ5ICdjcmVhdGlvblRpbWUnXG4gICAqIGFuZCByZXR1cm4gdGhlIGxhdGVzdCBvbmUuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldExhdGVzdE1hdGNoaW5nT3BlcmF0aW9uKGZpbHRlcnNMaXN0OiBhbnlbXSk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGxldCBtYXRjaGluZ09wZXJhdGlvbjogSU9wZXJhdGlvbiA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlcnMgb2YgZmlsdGVyc0xpc3QpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbikge1xuICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID1cbiAgICAgICAgICAgIG5ldyBEYXRlKG1hdGNoaW5nT3BlcmF0aW9uLmNyZWF0aW9uVGltZSkuZ2V0VGltZSgpIDxcbiAgICAgICAgICAgIG5ldyBEYXRlKG9wZXJhdGlvbnNbMF0uY3JlYXRpb25UaW1lKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgPyBvcGVyYXRpb25zWzBdXG4gICAgICAgICAgICAgIDogbWF0Y2hpbmdPcGVyYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0Y2hpbmdPcGVyYXRpb24gPSBvcGVyYXRpb25zWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIG9wZXJhdGlvbiBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIGl0cyBwcm9ncmVzcy5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gY3JlYXRlIGFuZCB0cmFjay5cbiAgICovXG4gIGNyZWF0ZU9ic2VydmVkT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5waXBlKFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKGNyZWF0ZWRPcGVyYXRpb24gPT4gdGhpcy5vYnNlcnZlT3BlcmF0aW9uKGNyZWF0ZWRPcGVyYXRpb24pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIHByb2dyZXNzIG9mIGdpdmVuIG9wZXJhdGlvbi5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gYmUgb2JzZXJ2ZWQuXG4gICAqL1xuICBvYnNlcnZlT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9ic2VydmVkT3BlcmF0aW9uJCA9IG9mKG9wZXJhdGlvbik7XG4gICAgY29uc3Qgb3BlcmF0aW9uVXBkYXRlcyQgPSBvYnNlcnZlZE9wZXJhdGlvbiQucGlwZShcbiAgICAgIHN3aXRjaE1hcChvYnNlcnZlZE9wZXJhdGlvbiA9PiB0aGlzLm9wZXJhdGlvblJlYWx0aW1lLm9uQWxsJChvYnNlcnZlZE9wZXJhdGlvbi5kZXZpY2VJZCkpLFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSBhcyBJT3BlcmF0aW9uKSxcbiAgICAgIHdpdGhMYXRlc3RGcm9tKG9ic2VydmVkT3BlcmF0aW9uJCksXG4gICAgICBmaWx0ZXIoKFtvcGVyYXRpb25VcGRhdGUsIG9ic2VydmVkT3BlcmF0aW9uXSkgPT4gb3BlcmF0aW9uVXBkYXRlLmlkID09PSBvYnNlcnZlZE9wZXJhdGlvbi5pZCksXG4gICAgICBzd2l0Y2hNYXAoKFtvcGVyYXRpb25VcGRhdGVdKSA9PiB7XG4gICAgICAgIGlmIChvcGVyYXRpb25VcGRhdGUuc3RhdHVzID09PSBPcGVyYXRpb25TdGF0dXMuRkFJTEVEKSB7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3Iob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Yob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVdoaWxlKG9wZXJhdGlvblVwZGF0ZSA9PiBvcGVyYXRpb25VcGRhdGUuc3RhdHVzICE9PSBPcGVyYXRpb25TdGF0dXMuU1VDQ0VTU0ZVTCwgdHJ1ZSlcbiAgICApO1xuICAgIHJldHVybiBtZXJnZShvYnNlcnZlZE9wZXJhdGlvbiQsIG9wZXJhdGlvblVwZGF0ZXMkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2luZ2xlIGV2ZW50IHdpdGggbGF0ZXN0IGNyZWF0aW9uVGltZSBmb3IgdGhlIGdpdmVuIGRldmljZSBJZCBhbmQgZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBldmVudHMgc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUuXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RDb25maWd1cmF0aW9uRXZlbnQoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICB0eXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJRXZlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBldmVudEZpbHRlcjogb2JqZWN0ID0ge1xuICAgICAgc291cmNlOiBkZXZpY2VJZCxcbiAgICAgIHR5cGUsXG4gICAgICBkYXRlRnJvbTogdGhpcy5kYXRlRnJvbS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiB0aGlzLmRhdGVUby50b0lTT1N0cmluZygpLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmV2ZW50Lmxpc3QoZXZlbnRGaWx0ZXIpO1xuICAgIHJldHVybiBkYXRhWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBkZXZpY2UgSWQsIGFuZCBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25UeXBlIE9wZXJhdGlvbiB0eXBlIGZyYWdtZW50LlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnRmlsZU9wZXJhdGlvbkxpc3QoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBvcGVyYXRpb25UeXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJT3BlcmF0aW9uW10+IHtcbiAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXI6IG9iamVjdCA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZnJhZ21lbnRUeXBlOiBvcGVyYXRpb25UeXBlLFxuICAgICAgZGF0ZUZyb206IHRoaXMuZGF0ZUZyb20udG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogdGhpcy5kYXRlVG8udG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAyMDAwXG4gICAgfTtcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5vcGVyYXRpb24ubGlzdChvcGVyYXRpb25GaWx0ZXIpKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbGF0ZXN0IHVwbG9hZGVkIGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZm9yIHRoZSBnaXZlbiBkZXZpY2UsIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gc25hcHNob3Qgd2FzIHVwbG9hZGVkLlxuICAgKiBAcGFyYW0gY29uZmlndXJhdGlvblR5cGUgU2VsZWN0ZWQgY29uZmlndXJhdGlvbiB0eXBlLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnU25hcHNob3QoXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nXG4gICk6IFByb21pc2U8Q29uZmlndXJhdGlvblNuYXBzaG90IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXZlbnQ6IElFdmVudCA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkV2ZW50KGRldmljZS5pZCwgY29uZmlndXJhdGlvblR5cGUpO1xuICAgIGxldCBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90O1xuICAgIGlmIChldmVudCkge1xuICAgICAgY29uZmlnU25hcHNob3QgPSB7XG4gICAgICAgIHRpbWU6IGV2ZW50LnRpbWUsXG4gICAgICAgIG5hbWU6IGV2ZW50LnRleHQsXG4gICAgICAgIGRldmljZVR5cGU6IGRldmljZS50eXBlLFxuICAgICAgICBjb25maWd1cmF0aW9uVHlwZVxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZ1NuYXBzaG90LmJpbmFyeSA9IGF3YWl0IChhd2FpdCB0aGlzLmV2ZW50QmluYXJ5LmRvd25sb2FkKGV2ZW50KSkudGV4dCgpO1xuICAgICAgICBpZiAoZXZlbnQuYzh5X0lzQmluYXJ5KSB7XG4gICAgICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5VHlwZSA9IGV2ZW50LmM4eV9Jc0JpbmFyeS50eXBlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBjb25zdCBtc2cgPSBnZXR0ZXh0KCdDb3VsZCBub3QgZ2V0IHRoZSBiaW5hcnkuJyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWdTbmFwc2hvdDtcbiAgfVxuXG4gIGFzeW5jIGdldExlZ2FjeUNvbmZpZ1NuYXBzaG90KGRldmljZUlkKSB7XG4gICAgbGV0IGNvbmZpZ1NuYXBzaG90OiBDb25maWd1cmF0aW9uU25hcHNob3Q7XG4gICAgbGV0IG1vO1xuICAgIGNvbnN0IGRldmljZSA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoZGV2aWNlSWQsIHsgd2l0aENoaWxkcmVuOiBmYWxzZSB9KSkuZGF0YTtcbiAgICBjb25zdCBzbmFwc2hvdElkID0gZGV2aWNlLmM4eV9Db25maWd1cmF0aW9uRHVtcCAmJiBkZXZpY2UuYzh5X0NvbmZpZ3VyYXRpb25EdW1wLmlkO1xuICAgIGlmICghc25hcHNob3RJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBtbyA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoc25hcHNob3RJZCkpLmRhdGE7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgaWYgKG1vKSB7XG4gICAgICBjb25maWdTbmFwc2hvdCA9IHtcbiAgICAgICAgdGltZTogbW8uY3JlYXRpb25UaW1lLFxuICAgICAgICBuYW1lOiBtby5uYW1lXG4gICAgICB9O1xuICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5ID0gYXdhaXQgdGhpcy5nZXRCaW5hcnlUZXh0KG1vLnVybCwgeyBhbGxvd0V4dGVybmFsOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1NuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0IGFzIHRleHQuXG4gICAqIEBwYXJhbSBiaW5hcnlVcmwgVGhlIFVSTCB0byBmaW5kIGJpbmFyeVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb2JqZWN0IHdpdGggYWRkaXRpb25hbCBvcHRpb25zOlxuICAgKiAtICoqYWxsb3dFeHRlcm5hbCoqIC0gYGJvb2xlYW5gIC0gYWxsb3dzIGRvd25sb2FkaW5nIGV4dGVybmFsIGJpbmFyeSBmaWxlXG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgYXN5bmMgZ2V0QmluYXJ5VGV4dChcbiAgICBiaW5hcnlVcmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGFsbG93RXh0ZXJuYWw6IGJvb2xlYW47IG5vQWxlcnRzPzogYm9vbGVhbiB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIGlmIChvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJpbmFyeSBvYmplY3QgYXMgRmlsZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKiphbGxvd0V4dGVybmFsKiogLSBgYm9vbGVhbmAgLSBhbGxvd3MgZG93bmxvYWRpbmcgZXh0ZXJuYWwgYmluYXJ5IGZpbGVcbiAgICovXG4gIGFzeW5jIGdldEJpbmFyeUZpbGUoYmluYXJ5VXJsOiBzdHJpbmcsIG9wdGlvbnM6IHsgYWxsb3dFeHRlcm5hbDogYm9vbGVhbiB9KTogUHJvbWlzZTxGaWxlPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBpZiAoIWJpbmFyeUlkICYmICFvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBAVE9ETzogbm90ZSB0aGF0IGl0IGRvZXNuJ3Qgc29sdmUgaXNzdWUgd2l0aCBleHRlcm5hbCBiaW5hcnkgaGVyZSwgc3VjaCB1cmwgd29uJ3QgaGF2ZSBiaW5hcnlJZCwgc28gd2Ugd29uJ3Qga25vdyB0aGUgbmFtZSBvciBjb250ZW50VHlwZSB0byB1c2UgaW4gRmlsZSBjb25zdHJ1Y3RvciwgbGV0J3MgYWRkIGEgQEZJWE1FIGNvbW1lbnQgZm9yIG5vdz9cbiAgICBjb25zdCB7IG5hbWUsIGNvbnRlbnRUeXBlIH0gPSAoYXdhaXQgdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKSkuZGF0YTtcbiAgICBjb25zdCByZXMgPSAhIWJpbmFyeUlkXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZClcbiAgICAgIDogYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCk7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gbmV3IEZpbGUoW2FycmF5QnVmZmVyXSwgbmFtZSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXN0IGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0NvbmZpZ3VyYXRpb24gYW5kIGM4eV9TZW5kQ29uZmlndXJhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdENvbmZpZ1VwZGF0ZU9wZXJhdGlvbihkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZGF0ZUZyb206IG5ldyBEYXRlKDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBkYXRlVG86IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXZlcnQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGF0ZXN0TWF0Y2hpbmdPcGVyYXRpb24oW1xuICAgICAgeyAuLi5maWx0ZXJzLCBmcmFnbWVudFR5cGU6ICdjOHlfQ29uZmlndXJhdGlvbicgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NlbmRDb25maWd1cmF0aW9uJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBpdHMgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBTdXBwb3J0cyBjOHlfU2VuZENvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqL1xuICBjcmVhdGVUZXh0QmFzZWRDb25maWd1cmF0aW9uUmVsb2FkT3BlcmF0aW9uKGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdSZXF1ZXN0ZWQgY3VycmVudCBjb25maWd1cmF0aW9uJyksXG4gICAgICBjOHlfU2VuZENvbmZpZ3VyYXRpb246IHt9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogU3VwcG9ydHMgYzh5X0NvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gd2hpY2ggd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIG9uZS5cbiAgICovXG4gIGNyZWF0ZVRleHRCYXNlZENvbmZpZ3VyYXRpb25VcGRhdGVPcGVyYXRpb24oZGV2aWNlOiBJTWFuYWdlZE9iamVjdCwgY29uZmlnOiBzdHJpbmcpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIHVwZGF0ZScpLFxuICAgICAgYzh5X0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgY29uZmlnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEJpbmFyeShiaW5hcnlJZDogSWRSZWZlcmVuY2UpOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kb3dubG9hZChiaW5hcnlJZCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGF2YWlsYWJsZSBzbmFwc2hvdHMgZnJvbSB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgc25hcHNob3RzIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICovXG4gIGFzeW5jIGdldFNuYXBzaG90c0Zyb21SZXBvc2l0b3J5KGRldmljZSwgY29uZmlndXJhdGlvblR5cGUpIHtcbiAgICBjb25zdCBzZWFyY2hRdWVyeSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2UsIGNvbmZpZ3VyYXRpb25UeXBlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxpc3RSZXBvc2l0b3J5RW50cmllcyhSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OLCB7XG4gICAgICBxdWVyeTogc2VhcmNoUXVlcnksXG4gICAgICBwYXJhbXM6IHsgcGFnZVNpemU6IDEwMCB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRldmljZSBhbHJlYWR5IGhhdmUgYSBnaXZlbiBzb2Z0d2FyZSBpbnN0YWxsZWRcbiAgICogQHBhcmFtIGRldmljZUlkIElkIG9mIHRoZSBkZXZpY2UgdG8gYmUgY2hlY2tlZFxuICAgKiBAcGFyYW0gc29mdHdhcmUgVGhlIHNvZnR3YXJlIHRvIGJlIGNoZWNrZWRcbiAgICovXG4gIGFzeW5jIGlzU29mdHdhcmVJbnN0YWxsZWRPbkRldmljZShcbiAgICBkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHNvZnR3YXJlOiBEZXZpY2VTb2Z0d2FyZVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlLmlzQVNNQXZhaWxhYmxlKCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlGaWx0ZXIgPSB7IGRldmljZUlkIH07XG4gICAgaWYgKHNvZnR3YXJlPy5uYW1lKSB7XG4gICAgICBzZXQocXVlcnlGaWx0ZXIsICduYW1lJywgc29mdHdhcmUubmFtZSk7XG4gICAgfVxuICAgIGlmIChzb2Z0d2FyZT8udmVyc2lvbikge1xuICAgICAgc2V0KHF1ZXJ5RmlsdGVyLCAndmVyc2lvbicsIHNvZnR3YXJlLnZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KHF1ZXJ5RmlsdGVyKS50aGVuKHJlc3VsdCA9PiAhIXJlc3VsdC5kYXRhPy5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0LlxuICAgKiBAcGFyYW0gYmluYXJ5SWQgYmluYXJ5IElEXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRJbnRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeUlkOiBJZFJlZmVyZW5jZSxcbiAgICBvcHRpb25zOiB7IG5vQWxlcnRzPzogYm9vbGVhbiB9ID0ge31cbiAgKTogUHJvbWlzZTxJRmV0Y2hSZXNwb25zZT4ge1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmRvd25sb2FkKGJpbmFyeUlkKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKCFvcHRpb25zLm5vQWxlcnRzKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgICAgdGhpcy5hbGVydC5kYW5nZXIobXNnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYmluYXJ5IG9iamVjdC5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeVVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgbm9BbGVydHM/OiBib29sZWFuIH0gPSB7fVxuICApOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmV0Y2hSZXMgPSBhd2FpdCBmZXRjaChiaW5hcnlVcmwpO1xuICAgICAgaWYgKGZldGNoUmVzLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgdGhyb3cgcmVzO1xuICAgICAgfVxuICAgICAgcmVzID0gZmV0Y2hSZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICBpZiAoIW9wdGlvbnMubm9BbGVydHMpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnQ291bGQgbm90IGdldCB0aGUgZXh0ZXJuYWwgYmluYXJ5Jyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUVudHJ5KG1vOiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pikge1xuICAgIGNvbnN0IGJpbmFyeUlkID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlCaW5hcnkuZ2V0SWRGcm9tVXJsKG1vLnVybCk7XG4gICAgY29uc3QgbmV3TW8gPSBhd2FpdCB0aGlzLmludmVudG9yeS5jcmVhdGUobW8pO1xuICAgIGlmIChiaW5hcnlJZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnkuY2hpbGRBZGRpdGlvbnNBZGQoYmluYXJ5SWQsIG5ld01vLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3TW87XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUVudHJ5KG1vOiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PiwgdXJsKSB7XG4gICAgY29uc3QgZXhpc3RpbmdCaW5hcnlJZCA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybCh1cmwpO1xuICAgIGNvbnN0IG5ld0JpbmFyeUlkID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlCaW5hcnkuZ2V0SWRGcm9tVXJsKG1vLnVybCk7XG4gICAgaWYgKGV4aXN0aW5nQmluYXJ5SWQgJiYgZXhpc3RpbmdCaW5hcnlJZCAhPT0gbmV3QmluYXJ5SWQpIHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5pbnZlbnRvcnlCaW5hcnkuZ2V0SWRGcm9tVXJsKHVybCk7XG4gICAgICBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kZWxldGUoaWQpO1xuICAgIH1cbiAgICBpZiAobmV3QmluYXJ5SWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW52ZW50b3J5LmNoaWxkQWRkaXRpb25zQWRkKG5ld0JpbmFyeUlkLCBtbyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS51cGRhdGUobW8pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCYXNlVmVyc2lvblJlc3VsdExpc3RGb3JMZWdhY3lFbnRyeShlbnRyeSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgcmVzOiB7fSBhcyBJRmV0Y2hSZXNwb25zZSxcbiAgICAgIGRhdGE6IFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLmVudHJ5LFxuICAgICAgICAgIFtlbnRyeS50eXBlXToge1xuICAgICAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogZW50cnkudXJsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSBhcyBJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXREZXZpY2VTb2Z0d2FyZUNoYW5nZXNGcm9tU29mdHdhcmVMaXN0T3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogSU9wZXJhdGlvbixcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0XG4gICk6IFByb21pc2U8RGV2aWNlU29mdHdhcmVDaGFuZ2VbXT4ge1xuICAgIGNvbnN0IGNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW10gPSBbXTtcbiAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZUxpc3QgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRTb2Z0d2FyZShkZXZpY2UsICdjOHlfU29mdHdhcmVMaXN0JywgW10pO1xuICAgIGZvckVhY2gob3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZUxpc3QsIG9wZXJhdGlvblNvZnR3YXJlID0+IHtcbiAgICAgIGNvbnN0IGRldmljZVNvZnR3YXJlID0gZmluZChkZXZpY2VTb2Z0d2FyZUxpc3QsIHsgbmFtZTogb3BlcmF0aW9uU29mdHdhcmUubmFtZSB9KTtcbiAgICAgIGlmIChcbiAgICAgICAgKG9wZXJhdGlvblNvZnR3YXJlICYmIG9wZXJhdGlvblNvZnR3YXJlLnZlcnNpb24pICE9PVxuICAgICAgICAoZGV2aWNlU29mdHdhcmUgJiYgZGV2aWNlU29mdHdhcmUudmVyc2lvbilcbiAgICAgICkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIC4uLm9wZXJhdGlvblNvZnR3YXJlLFxuICAgICAgICAgIGFjdGlvbjogJ2luc3RhbGwnXG4gICAgICAgIH0gYXMgRGV2aWNlU29mdHdhcmVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvckVhY2goZGV2aWNlU29mdHdhcmVMaXN0LCBkZXZpY2VTb2Z0d2FyZSA9PiB7XG4gICAgICBjb25zdCBvcGVyYXRpb25Tb2Z0d2FyZSA9IGZpbmQob3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZUxpc3QsIHsgbmFtZTogZGV2aWNlU29mdHdhcmUubmFtZSB9KTtcbiAgICAgIGlmIChcbiAgICAgICAgKG9wZXJhdGlvblNvZnR3YXJlICYmIG9wZXJhdGlvblNvZnR3YXJlLnZlcnNpb24pICE9PVxuICAgICAgICAoZGV2aWNlU29mdHdhcmUgJiYgZGV2aWNlU29mdHdhcmUudmVyc2lvbilcbiAgICAgICkge1xuICAgICAgICBjb25zdCBpbnN0YWxsQ2hhbmdlID0gY2hhbmdlcy5maW5kKFxuICAgICAgICAgIGNoYW5nZSA9PiBkZXZpY2VTb2Z0d2FyZS5uYW1lID09PSBjaGFuZ2UubmFtZSAmJiBjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCdcbiAgICAgICAgKTtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGlzIHNvZnR3YXJlIGlzIG5vdCBhbiBpbnN0YWxsYXRpb24gc29mdHdhcmUgY2hhbmdlLCBvdGhlcndpc2UgaXQncyBhbiB1cGRhdGUgYW5kIG5vdCBhIHJlbW92YWxcbiAgICAgICAgaWYgKCFpbnN0YWxsQ2hhbmdlKSB7XG4gICAgICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLmRldmljZVNvZnR3YXJlLFxuICAgICAgICAgICAgYWN0aW9uOiAnZGVsZXRlJ1xuICAgICAgICAgIH0gYXMgRGV2aWNlU29mdHdhcmVDaGFuZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21Tb2Z0d2FyZU9wZXJhdGlvbihcbiAgICBvcGVyYXRpb246IElPcGVyYXRpb24sXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdFxuICApOiBQcm9taXNlPERldmljZVNvZnR3YXJlQ2hhbmdlW10+IHtcbiAgICBjb25zdCBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdID0gW107XG4gICAgY29uc3QgZGV2aWNlU29mdHdhcmUgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRTb2Z0d2FyZShkZXZpY2UsICdjOHlfU29mdHdhcmUnLCB7fSk7XG4gICAgZm9yRWFjaChkZXZpY2VTb2Z0d2FyZSwgKGRldmljZVNvZnR3YXJlVmVyc2lvbiwgZGV2aWNlU29mdHdhcmVOYW1lKSA9PiB7XG4gICAgICBpZiAob3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZVtkZXZpY2VTb2Z0d2FyZU5hbWVdICE9PSBkZXZpY2VTb2Z0d2FyZVZlcnNpb24pIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBkZXZpY2VTb2Z0d2FyZU5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogZGV2aWNlU29mdHdhcmVWZXJzaW9uLFxuICAgICAgICAgIGFjdGlvbjogJ2RlbGV0ZSdcbiAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yRWFjaChvcGVyYXRpb24uYzh5X1NvZnR3YXJlLCAob3BlcmF0aW9uU29mdHdhcmVWZXJzaW9uLCBvcGVyYXRpb25Tb2Z0d2FyZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGRldmljZVNvZnR3YXJlVmVyc2lvbiA9IGRldmljZVNvZnR3YXJlICYmIGRldmljZVNvZnR3YXJlW29wZXJhdGlvblNvZnR3YXJlTmFtZV07XG4gICAgICBpZiAoZGV2aWNlU29mdHdhcmVWZXJzaW9uICE9PSBvcGVyYXRpb25Tb2Z0d2FyZVZlcnNpb24pIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBvcGVyYXRpb25Tb2Z0d2FyZU5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogb3BlcmF0aW9uU29mdHdhcmVWZXJzaW9uLFxuICAgICAgICAgIGFjdGlvbjogJ2luc3RhbGwnXG4gICAgICAgIH0gYXMgRGV2aWNlU29mdHdhcmVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDdXJyZW50U29mdHdhcmUoXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBzd0ZyYWdtZW50OiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBvYmplY3RcbiAgKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCBpc0FTTUF2YWlsYWJsZSA9IGF3YWl0IHRoaXMuYWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UuaXNBU01BdmFpbGFibGUoKTtcbiAgICBpZiAoaXNBU01BdmFpbGFibGUpIHtcbiAgICAgIGxldCBzb2Z0d2FyZVJlc3VsdExpc3Q6IElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0PiA9IGF3YWl0IHRoaXMuYWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UubGlzdChcbiAgICAgICAgeyBkZXZpY2VJZDogZGV2aWNlLmlkLCBwYWdlU2l6ZTogMTAwIH1cbiAgICAgICk7XG4gICAgICBsZXQgbGlzdCA9IChzb2Z0d2FyZVJlc3VsdExpc3Q/LmRhdGEgfHwgW10pLm1hcChzdyA9PlxuICAgICAgICBwaWNrKG9taXRCeShzdywgaXNOaWwpLCBbJ25hbWUnLCAndmVyc2lvbicsICd1cmwnLCAnc29mdHdhcmVUeXBlJ10pXG4gICAgICApO1xuXG4gICAgICB3aGlsZSAoc29mdHdhcmVSZXN1bHRMaXN0LnBhZ2luZz8ubmV4dFBhZ2UpIHtcbiAgICAgICAgc29mdHdhcmVSZXN1bHRMaXN0ID0gYXdhaXQgc29mdHdhcmVSZXN1bHRMaXN0LnBhZ2luZy5uZXh0KCk7XG4gICAgICAgIGxpc3QgPSBbXG4gICAgICAgICAgLi4ubGlzdCxcbiAgICAgICAgICAuLi4oc29mdHdhcmVSZXN1bHRMaXN0Py5kYXRhIHx8IFtdKS5tYXAoc3cgPT5cbiAgICAgICAgICAgIHBpY2sob21pdEJ5KHN3LCBpc05pbCksIFsnbmFtZScsICd2ZXJzaW9uJywgJ3VybCcsICdzb2Z0d2FyZVR5cGUnXSlcbiAgICAgICAgICApXG4gICAgICAgIF07XG4gICAgICB9XG5cbiAgICAgIGlmICghbGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZSkgPyBsaXN0IDogdGhpcy5zb2Z0d2FyZUxpc3RUb0xlZ2FjeShsaXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRldmljZVtzd0ZyYWdtZW50XSB8fCBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzb2Z0d2FyZUxpc3RUb0xlZ2FjeShsaXN0OiBJTWFuYWdlZE9iamVjdFtdKTogb2JqZWN0IHtcbiAgICByZXR1cm4gKGxpc3QgfHwgW10pLnJlZHVjZSgocHJldiwgY3VycikgPT4gKHsgLi4ucHJldiwgW2N1cnIubmFtZV06IGN1cnIudmVyc2lvbiB9KSwge30pO1xuICB9XG59XG4iXX0=
1089
+ }], ctorParameters: function () { return [{ type: i1.InventoryService }, { type: i1.InventoryBinaryService }, { type: i1.OperationService }, { type: i2.AlertService }, { type: i1.EventService }, { type: i2.OperationRealtimeService }, { type: i1.EventBinaryService }, { type: i3.AdvancedSoftwareService }, { type: i2.GlobalConfigService }]; } });
1090
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3NpdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zaGFyZWQvcmVwb3NpdG9yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBT1osc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUloQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFdBQVcsRUFDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsWUFBWSxFQUNaLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsTUFBTSxFQUNOLFNBQVMsRUFDVCxJQUFJLEVBQ0osT0FBTyxFQUNQLEdBQUcsRUFDSCxJQUFJLEVBQ0osS0FBSyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsTUFBTSxFQUNOLElBQUksRUFDSixNQUFNLEVBQ04sR0FBRyxFQUNKLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFRTCx1QkFBdUIsRUFHdkIsY0FBYyxFQUdmLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBRzVCLE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFDVSxTQUEyQixFQUMzQixlQUF1QyxFQUN2QyxT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LEVBQUU7WUFDeEQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3JEO0lBQ0gsQ0FBQzs7OEdBMXlDVSxpQkFBaUI7a0hBQWpCLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRXZlbnRCaW5hcnlTZXJ2aWNlLFxuICBFdmVudFNlcnZpY2UsXG4gIElkUmVmZXJlbmNlLFxuICBJRXZlbnQsXG4gIElGZXRjaFJlc3BvbnNlLFxuICBJSWRlbnRpZmllZCxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIElNYW5hZ2VkT2JqZWN0QmluYXJ5LFxuICBJbnZlbnRvcnlCaW5hcnlTZXJ2aWNlLFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBJT3BlcmF0aW9uLFxuICBJUmVzdWx0LFxuICBJUmVzdWx0TGlzdCxcbiAgT3BlcmF0aW9uU2VydmljZSxcbiAgT3BlcmF0aW9uU3RhdHVzLFxuICBRdWVyaWVzVXRpbFxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIGdldHRleHQsXG4gIEdsb2JhbENvbmZpZ1NlcnZpY2UsXG4gIE9wZXJhdGlvblJlYWx0aW1lU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIG1hcCBhcyBfbWFwLFxuICBhc3NpZ24sXG4gIGNsb25lRGVlcCxcbiAgZmluZCxcbiAgZm9yRWFjaCxcbiAgZ2V0LFxuICBoZWFkLFxuICBpc05pbCxcbiAgaXNTdHJpbmcsXG4gIGlzVW5kZWZpbmVkLFxuICBvbWl0QnksXG4gIHBpY2ssXG4gIHJlbW92ZSxcbiAgc2V0XG59IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBkZWZlciwgZnJvbSwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlV2hpbGUsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UgfSBmcm9tICcuL2FkdmFuY2VkLXNvZnR3YXJlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICBEZXZpY2VGaXJtd2FyZSxcbiAgRGV2aWNlU29mdHdhcmUsXG4gIERldmljZVNvZnR3YXJlQ2hhbmdlLFxuICBGaXJtd2FyZUJpbmFyeSxcbiAgRmlybXdhcmVQYXRjaEJpbmFyeSxcbiAgTW9kYWxNb2RlbCxcbiAgUkVQT1NJVE9SWV9CSU5BUllfVFlQRVMsXG4gIFJlcG9zaXRvcnlCaW5hcnksXG4gIFJlcG9zaXRvcnlDYXRlZ29yeSxcbiAgUmVwb3NpdG9yeVR5cGUsXG4gIFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeSxcbiAgU29mdHdhcmVCaW5hcnlcbn0gZnJvbSAnLi9yZXBvc2l0b3J5Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgZGF0ZUZyb20gPSBuZXcgRGF0ZSgwKTtcbiAgcmVhZG9ubHkgZGF0ZVRvID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKTsgLy8gMSBkYXkgaW4gdGhlIGZ1dHVyZVxuICBwcml2YXRlIHF1ZXJpZXNVdGlsOiBRdWVyaWVzVXRpbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeUJpbmFyeTogSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIG9wZXJhdGlvbjogT3BlcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudDogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3BlcmF0aW9uUmVhbHRpbWU6IE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50QmluYXJ5OiBFdmVudEJpbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhZHZhbmNlZFNvZnR3YXJlU2VydmljZTogQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnbG9iYWxDb25maWdTZXJ2aWNlOiBHbG9iYWxDb25maWdTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucXVlcmllc1V0aWwgPSBuZXcgUXVlcmllc1V0aWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyByZXBvc2l0b3J5IGVudHJpZXMgb2YgZ2l2ZW4gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgcmVwb3NpdG9yeSBlbnRyaWVzIHRvIGxpc3QuXG4gICAqIEBwYXJhbSBvcHRpb25zIEV4dHJhIGxpc3Rpbmcgb3B0aW9ucy5cbiAgICovXG4gIGxpc3RSZXBvc2l0b3J5RW50cmllcyhcbiAgICB0eXBlOiBSZXBvc2l0b3J5VHlwZSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgLyoqIEFkZGl0aW9uYWwgcXVlcnkuICovXG4gICAgICBxdWVyeT86IGFueTtcbiAgICAgIC8qKiAoZGVwcmVjYXRlZCAtIHRvIGJlIHJlbW92ZWQpIE9ubHkgaW5jbHVkZSBlbnRyaWVzIHdpdGggbWF0Y2hpbmcgcGFydGlhbCBuYW1lcy4gKi9cbiAgICAgIHBhcnRpYWxOYW1lPzogc3RyaW5nO1xuICAgICAgLyoqIEluY2x1ZGUgZW50cmllcyB3aXRoIG1hdGNoaW5nIHBhcnRpYWwgdGV4dCBpbiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuICovXG4gICAgICBwYXJ0aWFsVGV4dEZpbHRlcj86IHsgcGFydGlhbFRleHQ6IHN0cmluZzsgcHJvcGVydGllczogc3RyaW5nW10gfTtcbiAgICAgIC8qKiBFeGNsdWRlIGxlZ2FjeSBlbnRyaWVzLiAqL1xuICAgICAgc2tpcExlZ2FjeT86IGJvb2xlYW47XG4gICAgICAvKiogRXhjbHVkZSBkZWZhdWx0IG9yZGVyaW5nLiAqL1xuICAgICAgc2tpcERlZmF1bHRPcmRlcj86IGJvb2xlYW47XG4gICAgICAvKiogT3RoZXIgcmVxdWVzdCBwYXJhbXMuICovXG4gICAgICBwYXJhbXM/OiBhbnk7XG4gICAgfVxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0T3JkZXIgPSBbeyBuYW1lOiAxIH1dO1xuICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0geyB0eXBlIH07XG4gICAgY29uc3QgbGVnYWN5RmlsdGVycyA9IHsgX19oYXM6IGB1cmxgIH07XG4gICAgbGV0IGZpbHRlcnMgPSB7fTtcblxuICAgIGxldCBmdWxsUXVlcnkgPSAob3B0aW9ucyAmJiBvcHRpb25zLnF1ZXJ5KSB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMgfHwgKG9wdGlvbnMgJiYgIW9wdGlvbnMuc2tpcERlZmF1bHRPcmRlcikpIHtcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkT3JkZXJieXMoZnVsbFF1ZXJ5LCBkZWZhdWx0T3JkZXIsICdwcmVwZW5kJyk7XG4gICAgfVxuXG4gICAgZnVsbFF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZnVsbFF1ZXJ5LCBkZWZhdWx0RmlsdGVycyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBhcnRpYWxUZXh0RmlsdGVyKSB7XG4gICAgICBjb25zdCB7IHBhcnRpYWxUZXh0LCBwcm9wZXJ0aWVzIH0gPSBvcHRpb25zLnBhcnRpYWxUZXh0RmlsdGVyO1xuICAgICAgY29uc3Qgb3JGaWx0ZXIgPSB7IF9fb3I6IHByb3BlcnRpZXMubWFwKHByb3BlcnR5ID0+ICh7IFtwcm9wZXJ0eV06IGAqJHtwYXJ0aWFsVGV4dH0qYCB9KSkgfTtcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKGZ1bGxRdWVyeSwgb3JGaWx0ZXIpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucGFydGlhbE5hbWUpIHtcbiAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlmXG4gICAgICBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihmdWxsUXVlcnksIHsgbmFtZTogYCoke29wdGlvbnMucGFydGlhbE5hbWV9KmAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5za2lwTGVnYWN5KSB7XG4gICAgICBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihmdWxsUXVlcnksIHsgX19ub3Q6IGxlZ2FjeUZpbHRlcnMgfSk7XG4gICAgfVxuXG4gICAgZmlsdGVycyA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkoZnVsbFF1ZXJ5KSxcbiAgICAgIHBhZ2VTaXplOiA1MCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlLFxuICAgICAgLi4uKChvcHRpb25zICYmIG9wdGlvbnMucGFyYW1zKSB8fCB7fSlcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5saXN0KGZpbHRlcnMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGFsOiBNb2RhbE1vZGVsLCB0eXBlOiBSZXBvc2l0b3J5VHlwZSwgbW86IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+ID0ge30pIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUmVwb3NpdG9yeVR5cGUuRklSTVdBUkU6XG4gICAgICBjYXNlIFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZXBvc2l0b3J5T2JqZWN0KG1vZGFsLCB0eXBlKTtcblxuICAgICAgY2FzZSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OOlxuICAgICAgICBPYmplY3QuYXNzaWduKG1vZGFsLCB7XG4gICAgICAgICAgc2VsZWN0ZWQ6IHtcbiAgICAgICAgICAgIGlkOiBtb2RhbC5zZWxlY3RlZD8uaWQgfHwgbW8uaWQsXG4gICAgICAgICAgICBuYW1lOiBtb2RhbC52ZXJzaW9uIHx8IG1vZGFsLnNlbGVjdGVkPy5uYW1lXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uVHlwZTogbW9kYWwuc2VsZWN0ZWQgPyBtb2RhbC5zZWxlY3RlZC5jb25maWd1cmF0aW9uVHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuYW1lOiBtb2RhbC52ZXJzaW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghbW9kYWwuZGV2aWNlVHlwZSAmJiBtby5pZCkge1xuICAgICAgICAgIG1vZGFsLmRldmljZVR5cGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9kYWwuc2VsZWN0ZWQgJiYgbW8uaWQpIHtcbiAgICAgICAgICBtb2RhbC5jb25maWd1cmF0aW9uVHlwZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXBvc2l0b3J5T2JqZWN0ID0gdGhpcy5jcmVhdGVSZXBvc2l0b3J5T2JqZWN0KG1vZGFsLCB0eXBlKTtcblxuICAgICAgICBpZiAobW8udXJsKSB7XG4gICAgICAgICAgY29uc3QgbmV3QmluYXJ5VXJsID0gKGF3YWl0IHJlcG9zaXRvcnlPYmplY3QpLnVybDtcbiAgICAgICAgICB0aGlzLnJlbW92ZU91dGRhdGVkQmluYXJ5KG5ld0JpbmFyeVVybCwgbW8udXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXBvc2l0b3J5T2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJlcG9zaXRvcnlPYmplY3QoXG4gICAgbW9kYWw6IE1vZGFsTW9kZWwsXG4gICAgdHlwZTogUmVwb3NpdG9yeVR5cGVcbiAgKTogUHJvbWlzZTxSZXBvc2l0b3J5Q2F0ZWdvcnk+IHtcbiAgICBsZXQgYmluYXJ5OiBJTWFuYWdlZE9iamVjdEJpbmFyeTtcbiAgICBsZXQgYmluYXJ5VVJMOiBzdHJpbmc7XG4gICAgbGV0IHJlcG9zaXRvcnlFbnRyeTogUmVwb3NpdG9yeUNhdGVnb3J5O1xuICAgIGxldCByZXBvc2l0b3J5QmluYXJ5OiBGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5O1xuICAgIGNvbnN0IG1vcyA9IFtdO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGVkOiB7IGlkOiBzZWxlY3RlZElkIH0sXG4gICAgICBiaW5hcnk6IHsgZmlsZSwgdXJsIH1cbiAgICB9ID0gbW9kYWw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdsb2JhbFBhcmFtID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxGcmFnbWVudCh0eXBlKTtcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgKHsgZGF0YTogYmluYXJ5IH0gPSBhd2FpdCB0aGlzLnNhdmVCaW5hcnkoZmlsZSwgZ2xvYmFsUGFyYW0pKTtcbiAgICAgICAgKHsgc2VsZjogYmluYXJ5VVJMIH0gPSBiaW5hcnkpO1xuICAgICAgICBpZiAodHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgICAgIG1vZGFsLmJpbmFyeS51cmwgPSBiaW5hcnlVUkw7XG4gICAgICAgIH1cbiAgICAgICAgbW9zLnB1c2goYmluYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpbmFyeVVSTCA9IHVybDtcbiAgICAgIH1cblxuICAgICAgKHsgZGF0YTogcmVwb3NpdG9yeUVudHJ5IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZU9yVXBkYXRlUmVwb3NpdG9yeUVudHJ5KFxuICAgICAgICB7IC4uLm1vZGFsLCAuLi5nbG9iYWxQYXJhbSB9LFxuICAgICAgICB0eXBlXG4gICAgICApKTtcbiAgICAgIGlmIChpc05pbChzZWxlY3RlZElkKSkge1xuICAgICAgICBtb3MucHVzaChyZXBvc2l0b3J5RW50cnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSAhPT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgICAoeyBkYXRhOiByZXBvc2l0b3J5QmluYXJ5IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVJlcG9zaXRvcnlCaW5hcnkoXG4gICAgICAgICAgeyAuLi5tb2RhbCwgLi4uZ2xvYmFsUGFyYW0gfSxcbiAgICAgICAgICBiaW5hcnlVUkwsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXBvc2l0b3J5RW50cnlcbiAgICAgICAgKSk7XG4gICAgICAgIG1vcy5wdXNoKHJlcG9zaXRvcnlCaW5hcnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxpbmtCaW5hcnkocmVwb3NpdG9yeUJpbmFyeSwgYmluYXJ5LCByZXBvc2l0b3J5RW50cnkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVwb3NpdG9yeUVudHJ5O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNsZWFuVXAobW9zKTtcbiAgICAgIHRoaXMuZXJyb3JNc2coKTtcblxuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBzYXZlQmluYXJ5KGZpbGU6IEZpbGUsIGdsb2JhbDogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4pOiBQcm9taXNlPElSZXN1bHQ8SU1hbmFnZWRPYmplY3RCaW5hcnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5QmluYXJ5LmNyZWF0ZShmaWxlLCBnbG9iYWwpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT3JVcGRhdGVSZXBvc2l0b3J5RW50cnkoXG4gICAgbW9kYWw6IE1vZGFsTW9kZWwsXG4gICAgdHlwZTogUmVwb3NpdG9yeVR5cGVcbiAgKTogUHJvbWlzZTxJUmVzdWx0PFJlcG9zaXRvcnlDYXRlZ29yeT4+IHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZDogeyBpZCwgbmFtZSB9LFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBkZXZpY2VUeXBlLFxuICAgICAgYzh5X0dsb2JhbCxcbiAgICAgIGJpbmFyeVxuICAgIH0gPSBtb2RhbDtcblxuICAgIGNvbnN0IG1vID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICB0eXBlLFxuICAgICAgYzh5X0dsb2JhbFxuICAgIH07XG5cbiAgICBpZiAoZGV2aWNlVHlwZSAmJiB0eXBlICE9PSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OKSB7XG4gICAgICBzZXQobW8sICdjOHlfRmlsdGVyLnR5cGUnLCBkZXZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlVHlwZSAmJiB0eXBlID09PSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OKSB7XG4gICAgICBzZXQobW8sICdkZXZpY2VUeXBlJywgZGV2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGFsLnNvZnR3YXJlVHlwZSkge1xuICAgICAgc2V0KG1vLCAnc29mdHdhcmVUeXBlJywgbW9kYWwuc29mdHdhcmVUeXBlLnNvZnR3YXJlVHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGFsLmNvbmZpZ3VyYXRpb25UeXBlKSB7XG4gICAgICBzZXQobW8sICdjb25maWd1cmF0aW9uVHlwZScsIG1vZGFsLmNvbmZpZ3VyYXRpb25UeXBlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgc2V0KG1vLCAndXJsJywgYmluYXJ5Py51cmwpO1xuICAgIH1cblxuICAgIHJldHVybiBpZFxuICAgICAgPyAodGhpcy5pbnZlbnRvcnkudXBkYXRlKG1vKSBhcyBQcm9taXNlPElSZXN1bHQ8UmVwb3NpdG9yeUNhdGVnb3J5Pj4pXG4gICAgICA6ICh0aGlzLmludmVudG9yeS5jcmVhdGUobW8pIGFzIFByb21pc2U8SVJlc3VsdDxSZXBvc2l0b3J5Q2F0ZWdvcnk+Pik7XG4gIH1cblxuICBjcmVhdGVSZXBvc2l0b3J5QmluYXJ5KFxuICAgIG1vZGFsOiBNb2RhbE1vZGVsLFxuICAgIGJpbmFyeVVSTDogc3RyaW5nLFxuICAgIHR5cGU6IFJlcG9zaXRvcnlUeXBlLFxuICAgIHBhcmVudDogUmVwb3NpdG9yeUNhdGVnb3J5XG4gICk6IFByb21pc2U8SVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT4+IHtcbiAgICBjb25zdCBtbyA9IHRoaXMucHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbCwgYmluYXJ5VVJMLCB0eXBlKTtcblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0NyZWF0ZShtbywgcGFyZW50KSBhcyBQcm9taXNlPFxuICAgICAgSVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT5cbiAgICA+O1xuICB9XG5cbiAgcHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbDogTW9kYWxNb2RlbCwgYmluYXJ5VVJMOiBzdHJpbmcsIHR5cGU6IFJlcG9zaXRvcnlUeXBlKSB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBwYXRjaFZlcnNpb24sIGRlcGVuZGVuY3ksIGM4eV9HbG9iYWwgfSA9IG1vZGFsO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHR5cGU6IFJFUE9TSVRPUllfQklOQVJZX1RZUEVTW3R5cGVdLFxuICAgICAgW3R5cGVdOiB7XG4gICAgICAgIHVybDogYmluYXJ5VVJMXG4gICAgICB9LFxuICAgICAgYzh5X0dsb2JhbFxuICAgIH07XG5cbiAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgc2V0KHJlc3VsdCwgW3R5cGUsICd2ZXJzaW9uJ10sIHBhdGNoVmVyc2lvbik7XG4gICAgICBhc3NpZ24ocmVzdWx0LCB7XG4gICAgICAgIGM4eV9QYXRjaDoge1xuICAgICAgICAgIGRlcGVuZGVuY3k6IGRlcGVuZGVuY3kuYzh5X0Zpcm13YXJlLnZlcnNpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldChyZXN1bHQsIFt0eXBlLCAndmVyc2lvbiddLCB2ZXJzaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGxpbmtCaW5hcnkoXG4gICAgcmVwb3NpdG9yeUJpbmFyeSxcbiAgICBiaW5hcnk6IElNYW5hZ2VkT2JqZWN0QmluYXJ5LFxuICAgIHJlcG9zaXRvcnlFbnRyeT86IFJlcG9zaXRvcnlDYXRlZ29yeVxuICApIHtcbiAgICBpZiAocmVwb3NpdG9yeUJpbmFyeSkge1xuICAgICAgY29uc3QgeyBpZDogcmVwb3NpdG9yeUJpbmFyeUlkIH0gPSByZXBvc2l0b3J5QmluYXJ5O1xuICAgICAgaWYgKGJpbmFyeSkge1xuICAgICAgICBjb25zdCB7IGlkOiBiaW5hcnlJZCB9ID0gYmluYXJ5O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkuY2hpbGRBZGRpdGlvbnNBZGQoYmluYXJ5SWQsIHJlcG9zaXRvcnlCaW5hcnlJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0FkZChiaW5hcnksIHJlcG9zaXRvcnlFbnRyeSk7XG4gIH1cblxuICBjbGVhblVwKG1vc1RvRGVsZXRlOiBJSWRlbnRpZmllZFtdKSB7XG4gICAgbW9zVG9EZWxldGUuZm9yRWFjaChtbyA9PiB7XG4gICAgICBjb25zdCB7IGM4eV9Jc0JpbmFyeSB9ID0gbW87XG4gICAgICBpc1VuZGVmaW5lZChjOHlfSXNCaW5hcnkpID8gdGhpcy5kZWxldGUobW8pIDogdGhpcy5pbnZlbnRvcnlCaW5hcnkuZGVsZXRlKG1vKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShlbnRpdHk6IElJZGVudGlmaWVkKTogUHJvbWlzZTxJUmVzdWx0PG51bGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5LmRlbGV0ZShlbnRpdHksIHsgZm9yY2VDYXNjYWRlOiB0cnVlIH0pO1xuICB9XG5cbiAgZXJyb3JNc2coKSB7XG4gICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnRmFpbGVkIHRvIHNhdmUnKTtcbiAgICB0aGlzLmFsZXJ0LmRhbmdlcihtc2cpO1xuICB9XG5cbiAgZ2V0QmFzZVZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBvZigxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20odGhpcy5saXN0QmFzZVZlcnNpb25zKGVudHJ5LCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KSkucGlwZShcbiAgICAgIG1hcCgoeyBwYWdpbmcgfSkgPT4gcGFnaW5nLnRvdGFsUGFnZXMpXG4gICAgKTtcbiAgfVxuXG4gIGdldEJhc2VWZXJzaW9uRnJvbU1PKG1vOiBSZXBvc2l0b3J5QmluYXJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGNoKG1vKSA/IGdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5JykgOiBnZXQobW8sICdjOHlfRmlybXdhcmUudmVyc2lvbicpO1xuICB9XG5cbiAgaXNQYXRjaChtbzogUmVwb3NpdG9yeUJpbmFyeSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5Jyk7XG4gIH1cblxuICBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCwgYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5pc0xlZ2FjeUVudHJ5KGJhc2VWZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIG9mKDApO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMubGlzdFBhdGNoVmVyc2lvbnMoZW50cnksIGJhc2VWZXJzaW9uLCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KVxuICAgICkucGlwZShtYXAoKHsgcGFnaW5nIH0pID0+IHBhZ2luZy50b3RhbFBhZ2VzKSk7XG4gIH1cblxuICBpc0xlZ2FjeUVudHJ5KGVudHJ5OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKGVudHJ5LnVybCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYWxsIHZlcnNpb25zIChiYXNlIGFuZCBwYXRjaCBvbmVzKSBvZiBnaXZlbiB0b3AgbGV2ZWwgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RBbGxWZXJzaW9ucyhlbnRyeTogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4sIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJhc2VWZXJzaW9uUmVzdWx0TGlzdEZvckxlZ2FjeUVudHJ5KGVudHJ5KTtcbiAgICB9XG5cbiAgICBjb25zdCBWRVJTSU9OX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7fSxcbiAgICAgIF9fb3JkZXJieTogW3sgJ2NyZWF0aW9uVGltZS5kYXRlJzogLTEgfSwgeyBjcmVhdGlvblRpbWU6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIFZFUlNJT05fRklMVEVSX09SREVSLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIGJhc2UgdmVyc2lvbnMgb2YgZ2l2ZW4gdG9wIGxldmVsIGVudHJ5LlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBAcGFyYW0gZW50cnkgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkuXG4gICAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBxdWVyeSBwYXJhbXMuXG4gICAqL1xuICBsaXN0QmFzZVZlcnNpb25zKGVudHJ5OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PiwgcGFyYW1zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0xlZ2FjeUVudHJ5KGVudHJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QmFzZVZlcnNpb25SZXN1bHRMaXN0Rm9yTGVnYWN5RW50cnkoZW50cnkpO1xuICAgIH1cblxuICAgIGNvbnN0IE5PX1BBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIF9fbm90OiB7IF9faGFzOiAnYzh5X1BhdGNoJyB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyAnY3JlYXRpb25UaW1lLmRhdGUnOiAtMSB9LCB7IGNyZWF0aW9uVGltZTogLTEgfV1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpc3RDaGlsZHJlbihlbnRyeSwgTk9fUEFUQ0hfRklMVEVSX09SREVSLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHBhdGNoIHZlcnNpb25zIG9mIGdpdmVuIGJhc2UgdmVyc2lvbiB1bmRlciB0aGUgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIGJhc2VWZXJzaW9uIEJhc2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RQYXRjaFZlcnNpb25zKGVudHJ5OiBJTWFuYWdlZE9iamVjdCwgYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5IHwgc3RyaW5nLCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IHZlcnNpb24gPSBpc1N0cmluZyhiYXNlVmVyc2lvbikgPyBiYXNlVmVyc2lvbiA6IGdldChiYXNlVmVyc2lvbiwgJ2M4eV9GaXJtd2FyZS52ZXJzaW9uJyk7XG4gICAgY29uc3QgUEFUQ0hfRklMVEVSX09SREVSID0ge1xuICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5JzogdmVyc2lvblxuICAgICAgfSxcbiAgICAgIF9fb3JkZXJieTogW3sgJ2NyZWF0aW9uVGltZS5kYXRlJzogLTEgfSwgeyBjcmVhdGlvblRpbWU6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIFBBVENIX0ZJTFRFUl9PUkRFUiwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBwYXRjaCB2ZXJzaW9ucyBvZiBnaXZlbiBiYXNlIHZlcnNpb24gdW5kZXIgdGhlIGVudHJ5IGluY2x1ZGluZyB0aGUgYmFzZSB2ZXJzaW9uLlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBJbiB0ZXJtcyBvZiBsZWdhY3kgYmFzZSB2ZXJzaW9uIHRoZSBlbnRyeSBnZXRzIHRyYW5zZm9ybWVkIHRvIGZpdCB0aGUgbmVlZGVkIGRhdGEgbW9kZWwuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIGJhc2VWZXJzaW9uIEJhc2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RCYXNlVmVyc2lvbkFuZFBhdGNoZXMoZW50cnk6IElNYW5hZ2VkT2JqZWN0LCBiYXNlVmVyc2lvbjogSU1hbmFnZWRPYmplY3QsIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYzh5X0Zpcm13YXJlOiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvbixcbiAgICAgICAgICAgICAgICB1cmw6IGVudHJ5LnVybFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IFBBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIF9fb3I6IHtcbiAgICAgICAgICAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbixcbiAgICAgICAgICAnYzh5X0Zpcm13YXJlLnZlcnNpb24nOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiAxIH0sIHsgJ2M4eV9GaXJtd2FyZS52ZXJzaW9uJzogMSB9XVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGlzdENoaWxkcmVuKGVudHJ5LCBQQVRDSF9GSUxURVJfT1JERVIsIHBhcmFtcyk7XG4gIH1cblxuICBsaXN0Q2hpbGRyZW4oZW50cnk6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LCBmaWx0ZXJzID0ge30sIHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb25zdCBjaGlsZHJlbkZpbHRlcnMgPSB7IF9fYnlncm91cGlkOiBlbnRyeS5pZCB9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZmlsdGVycywgY2hpbGRyZW5GaWx0ZXJzKTtcbiAgICAvLyBGSVhNRTogbmVlZGVkIGJlY2F1c2Ugb2YgaXNzdWUgaW4gZm9yT2YgZGlyZWN0aXZlICguLi4pXG4gICAgcGFyYW1zLndpdGhUb3RhbFBhZ2VzID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkubGlzdFF1ZXJ5KHF1ZXJ5LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYWxsIGl0ZW1zIGZyb20gdGhlIGxpc3Qgc3RhcnRpbmcgd2l0aCB0aGUgcHJvdmlkZWQgcGFnZS5cbiAgICogQHBhcmFtIGZpcnN0UGFnZSBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgbGlzdCB0byBmZXRjaCBhbGwgaXRlbXMgZm9yLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBbGxJdGVtc0Zyb21MaXN0KGZpcnN0UGFnZSkge1xuICAgIGxldCBhbGxJdGVtcztcblxuICAgIGlmICghZmlyc3RQYWdlLnRoZW4pIHtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLmZpcnN0UGFnZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IHBhZ2luZywgZGF0YTogaXRlbXMgfSA9IGF3YWl0IGZpcnN0UGFnZTtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLml0ZW1zXTtcblxuICAgICAgd2hpbGUgKHBhZ2luZyAmJiBwYWdpbmcubmV4dFBhZ2UpIHtcbiAgICAgICAgKHsgcGFnaW5nLCBkYXRhOiBpdGVtcyB9ID0gYXdhaXQgcGFnaW5nLm5leHQoKSk7XG4gICAgICAgIGFsbEl0ZW1zID0gWy4uLmFsbEl0ZW1zLCAuLi5pdGVtc107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgbWFuYWdlZCBvYmplY3QgZm9yIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbi5cbiAgICogQHBhcmFtIG1vIEJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdCB3aXRoIHBhcmVudHMuXG4gICAqL1xuICBnZXRSZXBvc2l0b3J5RW50cnlNTyQobW86IElNYW5hZ2VkT2JqZWN0KTogT2JzZXJ2YWJsZTxJTWFuYWdlZE9iamVjdCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghbW8pIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgICBjb25zdCBbcmVmZXJlbmNlXSA9IGdldChtbywgJ2FkZGl0aW9uUGFyZW50cy5yZWZlcmVuY2VzJyk7XG4gICAgY29uc3QgaWQgPSBnZXQocmVmZXJlbmNlLCAnbWFuYWdlZE9iamVjdC5pZCcpO1xuICAgIHJldHVybiBpZFxuICAgICAgPyBmcm9tKHRoaXMuaW52ZW50b3J5LmRldGFpbChpZCwgeyB3aXRoQ2hpbGRyZW46IGZhbHNlIH0pKS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxuICAgICAgOiBvZih1bmRlZmluZWQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdC5cbiAgICogQHBhcmFtIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudCBEZXZpY2UgcmVwb3NpdG9yeSBmcmFnbWVudC5cbiAgICogQHBhcmFtIHR5cGUgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgdHlwZS5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBvYmplY3Qgd2l0aCBvcHRpb25zOlxuICAgKiAtICoqc2tpcExlZ2FjeSoqIC0gYGJvb2xlYW5gIC0gRXhjbHVkZSBsZWdhY3kgZW50cmllcy5cbiAgICogLSAqKmZpbHRlcnMqKiAtIGBvYmplY3RgIC0gRmlsdGVyIG9iamVjdC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgYXMgaXQgZG9lc24ndCBzdXBwb3J0ICdtaXNzaW5nIHVybCcgY2FzZVxuICAgKi9cbiAgZ2V0UmVwb3NpdG9yeUJpbmFyeU1vQnlWZXJzaW9uKFxuICAgIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudDogRGV2aWNlRmlybXdhcmUgfCBEZXZpY2VTb2Z0d2FyZSxcbiAgICB0eXBlOiBSZXBvc2l0b3J5VHlwZSxcbiAgICB7IHNraXBMZWdhY3kgPSBmYWxzZSwgZmlsdGVycyA9IHt9IH06IHsgc2tpcExlZ2FjeT86IGJvb2xlYW47IGZpbHRlcnM/OiBvYmplY3QgfSA9IHt9XG4gICk6IFByb21pc2U8SU1hbmFnZWRPYmplY3Q+IHtcbiAgICBjb25zdCB7IHZlcnNpb24sIHVybCwgbmFtZSB9ID0gZGV2aWNlUmVwb3NpdG9yeUZyYWdtZW50O1xuICAgIGNvbnN0IHJlcG9zaXRvcnlCaW5hcnlUeXBlID0gUkVQT1NJVE9SWV9CSU5BUllfVFlQRVNbdHlwZV07XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGNvbnN0IG5ld01vZGVsQmFzZVZlcnNpb25RdWVyeSA9IHtcbiAgICAgIFtgJHt0eXBlfS52ZXJzaW9uYF06IHZlcnNpb24sXG4gICAgICBbYCR7dHlwZX0udXJsYF06IHVybCxcbiAgICAgIHR5cGU6IHJlcG9zaXRvcnlCaW5hcnlUeXBlXG4gICAgfTtcbiAgICBjb25zdCBsZWdhY3lWZXJzaW9uUXVlcnkgPSB7IHVybCwgdHlwZSwgbmFtZSB9O1xuICAgIGZpbHRlcnMgPSB7IHdpdGhDaGlsZHJlbjogZmFsc2UsIHdpdGhQYXJlbnRzOiB0cnVlLCAuLi5maWx0ZXJzIH07XG5cbiAgICBpZiAoc2tpcExlZ2FjeSkge1xuICAgICAgcXVlcnkgPSB7XG4gICAgICAgIF9fYW5kOiB7XG4gICAgICAgICAgLi4ubmV3TW9kZWxCYXNlVmVyc2lvblF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICBfX29yOiBbeyBfX2FuZDogeyAuLi5uZXdNb2RlbEJhc2VWZXJzaW9uUXVlcnkgfSB9LCB7IF9fYW5kOiB7IC4uLmxlZ2FjeVZlcnNpb25RdWVyeSB9IH1dXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5saXN0UXVlcnkocXVlcnksIGZpbHRlcnMpLnRoZW4oKHsgZGF0YSB9KSA9PiBoZWFkKGRhdGEpKTtcbiAgfVxuXG4gIGdldEJpbmFyeU5hbWUkKGJpbmFyeVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoIWJpbmFyeVVybCkge1xuICAgICAgcmV0dXJuIG9mKCctLS0nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5hcnlJZCA9IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybChiaW5hcnlVcmwpO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIHJldHVybiBvZihiaW5hcnlVcmwpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmZXIoKCkgPT4gdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpLnBpcGUoXG4gICAgICBtYXAobW8gPT4gbW8ubmFtZSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBpbnZlbnRvcnkgcXVlcnkgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmRcbiAgICogcmVwb3NpdG9yeSBlbnRyaWVzIG9mIHNwZWNpZmllZCB0eXBlIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHByb3ZpZGVkIGRldmljZS5cbiAgICogQHBhcmFtIHJlcG9zaXRvcnlUeXBlIFRoZSB0eXBlIG9mIHJlcG9zaXRvcnkgZW50cmllcyB3aGljaCB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cblxuICBnZXREZXZpY2VUeXBlUXVlcnkocmVwb3NpdG9yeVR5cGU6IFJlcG9zaXRvcnlUeXBlLCBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyB0eXBlOiByZXBvc2l0b3J5VHlwZSB9O1xuICAgIGlmIChyZXBvc2l0b3J5VHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgaWYgKGRldmljZS50eXBlKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHJlc3VsdCwge1xuICAgICAgICAgIF9fb3I6IFt7IGRldmljZVR5cGU6IGRldmljZS50eXBlIH0sIHsgX19ub3Q6IHsgX19oYXM6IGBkZXZpY2VUeXBlYCB9IH1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihyZXN1bHQsIHtcbiAgICAgICAgX19vcjogW1xuICAgICAgICAgIHsgJ2M4eV9GaWx0ZXIudHlwZSc6IGRldmljZS50eXBlIH0sXG4gICAgICAgICAgeyAnYzh5X0ZpbHRlci50eXBlJzogJycgfSxcbiAgICAgICAgICB7IF9fbm90OiB7IF9faGFzOiBgYzh5X0ZpbHRlci50eXBlYCB9IH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gaW52ZW50b3J5IHF1ZXJ5IG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaW5kXG4gICAqIHJlcG9zaXRvcnkgZW50cmllcyBtYXRjaGluZyB0aGUgcHJlZGVmaW5lZCBzb2Z0d2FyZSB0eXBlcyBwcm92aWRlZCBpbiB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHdoaWNoIHRoZSBzb2Z0d2FyZSB0eXBlcyBmaWx0ZXJzIHdpbGwgYmUgYXR0YWNoZWQuIERlZmF1bHQgdmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5nIHJlcG9zaXRvcnkgdHlwZSBzb2Z0d2FyZS5cbiAgICovXG4gIGdldFNvZnR3YXJlVHlwZVF1ZXJ5KGRldmljZTogSU1hbmFnZWRPYmplY3QsIHF1ZXJ5Pzogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyAuLi4ocXVlcnkgfHwge30pLCB0eXBlOiBSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSB9O1xuXG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkU29mdHdhcmVUeXBlcykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIocmVzdWx0LCB7XG4gICAgICAgIF9fb3I6IFtkZXZpY2UuYzh5X1N1cHBvcnRlZFNvZnR3YXJlVHlwZXMubWFwKHR5cGUgPT4gKHsgc29mdHdhcmVUeXBlOiB0eXBlIH0pKV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuIGludmVudG9yeSBxdWVyeSBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBjb25maWd1cmF0aW9uIHJlcG9zaXRvcnkgZW50cmllc1xuICAgKiBtYXRjaGluZyB0aGUgdHlwZSBvZiBwcm92aWRlZCBkZXZpY2UgYW5kIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSBlbnRyaWVzIHdpbGwgYmUgcXVlcmllZCB3aXRoIHRoZSBnZW5lcmF0ZWQgcXVlcnkuXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uVHlwZSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nKTogb2JqZWN0IHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0RGV2aWNlVHlwZVF1ZXJ5KFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04sIGRldmljZSk7XG4gICAgcmV0dXJuIHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHF1ZXJ5LCB7XG4gICAgICBfX29yOiBbXG4gICAgICAgIHsgY29uZmlndXJhdGlvblR5cGUgfSxcbiAgICAgICAgeyBjb25maWd1cmF0aW9uVHlwZTogJycgfSxcbiAgICAgICAgeyBfX25vdDogeyBfX2hhczogYGNvbmZpZ3VyYXRpb25UeXBlYCB9IH1cbiAgICAgIF1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNvZnR3YXJlIGluc3RhbGxlZCBpbiB0aGUgZGV2aWNlIGluIHRoZSB1bmlmb3JtIGZvcm1hdC5cbiAgICogU3VwcG9ydHMgYzh5X1NvZnR3YXJlTGlzdCBhbmQgYzh5X1NvZnR3YXJlIGZyYWdtZW50cy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIHdob3NlIHNvZnR3YXJlIGxpc3Qgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKi9cbiAgZ2V0RGV2aWNlU29mdHdhcmVMaXN0KGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBEZXZpY2VTb2Z0d2FyZVtdIHtcbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSkge1xuICAgICAgcmV0dXJuIF9tYXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSwgKHZlcnNpb24sIG5hbWUpID0+ICh7IG5hbWUsIHZlcnNpb24gfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBsaXN0IG9mIGNoYW5nZXMsIGFuZCBzZW5kcyBpdCB0byB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2Ugd2hpY2ggdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGFuZCBzZW50IHRvLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgc29mdHdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjaGFuZ2VzLlxuICAgKiBSZXR1cm5lZCBvcGVyYXRpb24gdHlwZSBkZXBlbmRzIG9uIGRldmljZSdzIHN1cHBvcnRlZCBvcGVyYXRpb25zLlxuICAgKiBTdXBwb3J0cyBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIGFuZCBjOHlfU29mdHdhcmUgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbjogSU9wZXJhdGlvbiA9IHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYEFwcGx5IHNvZnR3YXJlIGNoYW5nZXM6ICR7Y2hhbmdlc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIGNoYW5nZSA9PlxuICAgICAgICAgICAgYCR7Y2hhbmdlLmFjdGlvbn0gXCIke2NoYW5nZS5uYW1lfVwiJHtcbiAgICAgICAgICAgICAgY2hhbmdlLnZlcnNpb24gPyBgICh2ZXJzaW9uOiAke2NoYW5nZS52ZXJzaW9ufSlgIDogJydcbiAgICAgICAgICAgIH1gXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgIH07XG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlVXBkYXRlJykpIHtcbiAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUgPSAoY2xvbmVEZWVwKGNoYW5nZXMpIHx8IFtdKS5tYXAoY2hhbmdlID0+XG4gICAgICAgIG9taXRCeShjaGFuZ2UsIGlzTmlsKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlTGlzdCcpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCA9IGNsb25lRGVlcChcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRDdXJyZW50U29mdHdhcmUoZGV2aWNlLCAnYzh5X1NvZnR3YXJlTGlzdCcsIFtdKVxuICAgICAgKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZTogRGV2aWNlU29mdHdhcmUgPSBwaWNrKG9taXRCeShjaGFuZ2UsIGlzTmlsKSwgW1xuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgJ3NvZnR3YXJlVHlwZSdcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICAgIHJlbW92ZShvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBjb25zdCBzb2Z0d2FyZUl0ZW1Ub1VwZGF0ZUlkeCA9IG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5uYW1lID09PSBjaGFuZ2UubmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBzb2Z0d2FyZVxuICAgICAgICAgICAgb3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZUxpc3Quc3BsaWNlKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4LCAxLCBkZXZpY2VTb2Z0d2FyZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc3RhbGwgc29mdHdhcmVcbiAgICAgICAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LnB1c2goZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChkZXZpY2UuYzh5X1N1cHBvcnRlZE9wZXJhdGlvbnMuaW5jbHVkZXMoJ2M4eV9Tb2Z0d2FyZScpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlID0gY2xvbmVEZWVwKGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZScsIHt9KSk7XG4gICAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZS5hY3Rpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgZGVsZXRlIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVbY2hhbmdlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlW2NoYW5nZS5uYW1lXSA9IGNoYW5nZS52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgbGlzdCBvZiBkZXZpY2Ugc29mdHdhcmUgY2hhbmdlcyBmcm9tIGdpdmVuIG9wZXJhdGlvbiBpbiB0aGUgY29udGV4dCBvZiBnaXZlbiBkZXZpY2UuXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBmcm9tIHdoaWNoIHRoZSBsaXN0IHNob3VsZCBiZSBleHRyYWN0ZWQuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIHRhcmdldCBkZXZpY2Ugb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21PcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uLFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPiB7XG4gICAgaWYgKG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAob3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZVVwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlU29mdHdhcmVDaGFuZ2VzRnJvbVNvZnR3YXJlTGlzdE9wZXJhdGlvbihvcGVyYXRpb24sIGRldmljZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VTb2Z0d2FyZUNoYW5nZXNGcm9tU29mdHdhcmVPcGVyYXRpb24ob3BlcmF0aW9uLCBkZXZpY2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBmaXJtd2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBzZWxlY3RlZCByZXBvc2l0b3J5IGJpbmFyeSwgYW5kIHNlbmRzIGl0IHRvIHRoZSBkZXZpY2UuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB3aGljaCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYW5kIHNlbnQgdG8uXG4gICAqIEBwYXJhbSBzZWxlY3RlZE9wdGlvbiBUaGUgc2VsZWN0ZWQgcmVwb3NpdG9yeSBiaW5hcnkgb3B0aW9uLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRmlybXdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBzZWxlY3RlZE9wdGlvbjogU2VsZWN0ZWRSZXBvc2l0b3J5QmluYXJ5XG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZ2V0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBzZWxlY3RlZE9wdGlvbik7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLm9wZXJhdGlvbi5jcmVhdGUob3BlcmF0aW9uKSkuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGZpcm13YXJlIHVwZGF0ZSBvcGVyYXRpb24gZm9yIGdpdmVuIGRldmljZSBhbmQgc2VsZWN0ZWQgdmVyc2lvbi5cbiAgICogU3VwcG9ydHMgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRPcHRpb24gU2VsZWN0ZWQgZmlybXdhcmUgdmVyc2lvbi5cbiAgICovXG4gIGdldEZpcm13YXJlVXBkYXRlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgc2VsZWN0ZWRPcHRpb246IFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBkZWxldGUgc2VsZWN0ZWRPcHRpb24uaWQ7XG5cbiAgICBjb25zdCBvcGVyYXRpb246IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGBVcGRhdGUgZmlybXdhcmUgdG86IFwiJHtzZWxlY3RlZE9wdGlvbi5uYW1lfVwiJHtcbiAgICAgICAgc2VsZWN0ZWRPcHRpb24udmVyc2lvbiA/IGAgKHZlcnNpb246ICR7c2VsZWN0ZWRPcHRpb24udmVyc2lvbn0pYCA6ICcnXG4gICAgICB9YCxcbiAgICAgIGM4eV9GaXJtd2FyZTogeyAuLi5zZWxlY3RlZE9wdGlvbiB9XG4gICAgfTtcblxuICAgIHJldHVybiBvcGVyYXRpb247XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgdXBsb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGlzTGVnYWN5ICBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXRVcGxvYWRDb25maWd1cmF0aW9uRmlsZU9wZXJhdGlvbihcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbmZpZ3VyYXRpb25UeXBlOiBzdHJpbmcsXG4gICAgaXNMZWdhY3kgPSBmYWxzZVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBpZiAoaXNMZWdhY3kpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmV0cmlldmUgY29uZmlndXJhdGlvbiBzbmFwc2hvdCBmcm9tIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9VcGxvYWRDb25maWdGaWxlOiB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFJldHJpZXZlICR7Y29uZmlndXJhdGlvblR5cGV9IGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZnJvbSBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X1VwbG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgY29uZmlndXJhdGlvbiBmaWxlIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgdXJsIG9mIGEgYmluYXJ5IHRvIGJlIGRvd25sb2FkZWQuXG4gICAqIEBwYXJhbSBpc0xlZ2FjeSBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXREb3dubG9hZENvbmZpZ3VyYXRpb25GaWxlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgY29uZmlndXJhdGlvblR5cGU6IHN0cmluZyxcbiAgICBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICAgIGlzTGVnYWN5ID0gZmFsc2VcbiAgKTogSU9wZXJhdGlvbiB7XG4gICAgaWYgKGlzTGVnYWN5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IHRvIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9Eb3dubG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgICBjOHlfQ29uZmlndXJhdGlvbkR1bXA6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWdTbmFwc2hvdC5pZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IG9mIGNvbmZpZ3VyYXRpb24gdHlwZSAke2NvbmZpZ3VyYXRpb25UeXBlfSB0byBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X0Rvd25sb2FkQ29uZmlnRmlsZToge1xuICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgZmlybXdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSBkZXZpY2VJZCBUaGUgSUQgb2YgdGhlIGRldmljZSB0byBmaW5kIGFuIG9wZXJhdGlvbiBmb3IuXG4gICAqL1xuICBhc3luYyBnZXRMYXN0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLFxuICAgICAgcmV2ZXJ0OiB0cnVlLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oW3sgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X0Zpcm13YXJlJyB9XSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UuXG4gICAqIExvb2tzIGZvciBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIG9yIGM4eV9Tb2Z0d2FyZSBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdFNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uKGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPElPcGVyYXRpb24+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBkYXRlRnJvbTogbmV3IERhdGUoMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAxXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXRlc3RNYXRjaGluZ09wZXJhdGlvbihbXG4gICAgICB7IC4uLmZpbHRlcnMsIGZyYWdtZW50VHlwZTogJ2M4eV9Tb2Z0d2FyZVVwZGF0ZScgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlTGlzdCcgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciB0aGUgbGlzdCBvZiBmaWx0ZXJzIGFuZCBxdWVyaWVzIHRoZSBvcGVyYXRpb25zLlxuICAgKiBJZiBhIHF1ZXJ5IHJldHVybnMgYXQgbGVhc3Qgb25lIG9wZXJhdGlvbiwgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLlxuICAgKiBPdGhlcndpc2UgdGhlIG5leHQgcXVlcnkgd2lsbCBiZSBwZXJmb3JtZWQuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oZmlsdGVyc0xpc3Q6IGFueVtdKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgbGV0IG1hdGNoaW5nT3BlcmF0aW9uID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZmlsdGVycyBvZiBmaWx0ZXJzTGlzdCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID0gb3BlcmF0aW9uc1swXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGxpc3Qgb2YgZmlsdGVycyBhbmQgcXVlcmllcyB0aGUgb3BlcmF0aW9ucy5cbiAgICogSXQgY29tcGFyZXMgdGhlIG9wZXJhdGlvbnMgcmV0cmlldmVkIGJ5IHRoZSBxdWVyaWVzIGJ5ICdjcmVhdGlvblRpbWUnXG4gICAqIGFuZCByZXR1cm4gdGhlIGxhdGVzdCBvbmUuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldExhdGVzdE1hdGNoaW5nT3BlcmF0aW9uKGZpbHRlcnNMaXN0OiBhbnlbXSk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGxldCBtYXRjaGluZ09wZXJhdGlvbjogSU9wZXJhdGlvbiA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlcnMgb2YgZmlsdGVyc0xpc3QpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbikge1xuICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID1cbiAgICAgICAgICAgIG5ldyBEYXRlKG1hdGNoaW5nT3BlcmF0aW9uLmNyZWF0aW9uVGltZSkuZ2V0VGltZSgpIDxcbiAgICAgICAgICAgIG5ldyBEYXRlKG9wZXJhdGlvbnNbMF0uY3JlYXRpb25UaW1lKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgPyBvcGVyYXRpb25zWzBdXG4gICAgICAgICAgICAgIDogbWF0Y2hpbmdPcGVyYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0Y2hpbmdPcGVyYXRpb24gPSBvcGVyYXRpb25zWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIG9wZXJhdGlvbiBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIGl0cyBwcm9ncmVzcy5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gY3JlYXRlIGFuZCB0cmFjay5cbiAgICovXG4gIGNyZWF0ZU9ic2VydmVkT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5waXBlKFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKGNyZWF0ZWRPcGVyYXRpb24gPT4gdGhpcy5vYnNlcnZlT3BlcmF0aW9uKGNyZWF0ZWRPcGVyYXRpb24pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIHByb2dyZXNzIG9mIGdpdmVuIG9wZXJhdGlvbi5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gYmUgb2JzZXJ2ZWQuXG4gICAqL1xuICBvYnNlcnZlT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9ic2VydmVkT3BlcmF0aW9uJCA9IG9mKG9wZXJhdGlvbik7XG4gICAgY29uc3Qgb3BlcmF0aW9uVXBkYXRlcyQgPSBvYnNlcnZlZE9wZXJhdGlvbiQucGlwZShcbiAgICAgIHN3aXRjaE1hcChvYnNlcnZlZE9wZXJhdGlvbiA9PiB0aGlzLm9wZXJhdGlvblJlYWx0aW1lLm9uQWxsJChvYnNlcnZlZE9wZXJhdGlvbi5kZXZpY2VJZCkpLFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSBhcyBJT3BlcmF0aW9uKSxcbiAgICAgIHdpdGhMYXRlc3RGcm9tKG9ic2VydmVkT3BlcmF0aW9uJCksXG4gICAgICBmaWx0ZXIoKFtvcGVyYXRpb25VcGRhdGUsIG9ic2VydmVkT3BlcmF0aW9uXSkgPT4gb3BlcmF0aW9uVXBkYXRlLmlkID09PSBvYnNlcnZlZE9wZXJhdGlvbi5pZCksXG4gICAgICBzd2l0Y2hNYXAoKFtvcGVyYXRpb25VcGRhdGVdKSA9PiB7XG4gICAgICAgIGlmIChvcGVyYXRpb25VcGRhdGUuc3RhdHVzID09PSBPcGVyYXRpb25TdGF0dXMuRkFJTEVEKSB7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3Iob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Yob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVdoaWxlKG9wZXJhdGlvblVwZGF0ZSA9PiBvcGVyYXRpb25VcGRhdGUuc3RhdHVzICE9PSBPcGVyYXRpb25TdGF0dXMuU1VDQ0VTU0ZVTCwgdHJ1ZSlcbiAgICApO1xuICAgIHJldHVybiBtZXJnZShvYnNlcnZlZE9wZXJhdGlvbiQsIG9wZXJhdGlvblVwZGF0ZXMkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2luZ2xlIGV2ZW50IHdpdGggbGF0ZXN0IGNyZWF0aW9uVGltZSBmb3IgdGhlIGdpdmVuIGRldmljZSBJZCBhbmQgZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBldmVudHMgc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUuXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RDb25maWd1cmF0aW9uRXZlbnQoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICB0eXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJRXZlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBldmVudEZpbHRlcjogb2JqZWN0ID0ge1xuICAgICAgc291cmNlOiBkZXZpY2VJZCxcbiAgICAgIHR5cGUsXG4gICAgICBkYXRlRnJvbTogdGhpcy5kYXRlRnJvbS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiB0aGlzLmRhdGVUby50b0lTT1N0cmluZygpLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmV2ZW50Lmxpc3QoZXZlbnRGaWx0ZXIpO1xuICAgIHJldHVybiBkYXRhWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBkZXZpY2UgSWQsIGFuZCBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25UeXBlIE9wZXJhdGlvbiB0eXBlIGZyYWdtZW50LlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnRmlsZU9wZXJhdGlvbkxpc3QoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBvcGVyYXRpb25UeXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJT3BlcmF0aW9uW10+IHtcbiAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXI6IG9iamVjdCA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZnJhZ21lbnRUeXBlOiBvcGVyYXRpb25UeXBlLFxuICAgICAgZGF0ZUZyb206IHRoaXMuZGF0ZUZyb20udG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogdGhpcy5kYXRlVG8udG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAyMDAwXG4gICAgfTtcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5vcGVyYXRpb24ubGlzdChvcGVyYXRpb25GaWx0ZXIpKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbGF0ZXN0IHVwbG9hZGVkIGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZm9yIHRoZSBnaXZlbiBkZXZpY2UsIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gc25hcHNob3Qgd2FzIHVwbG9hZGVkLlxuICAgKiBAcGFyYW0gY29uZmlndXJhdGlvblR5cGUgU2VsZWN0ZWQgY29uZmlndXJhdGlvbiB0eXBlLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnU25hcHNob3QoXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nXG4gICk6IFByb21pc2U8Q29uZmlndXJhdGlvblNuYXBzaG90IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXZlbnQ6IElFdmVudCA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkV2ZW50KGRldmljZS5pZCwgY29uZmlndXJhdGlvblR5cGUpO1xuICAgIGxldCBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90O1xuICAgIGlmIChldmVudCkge1xuICAgICAgY29uZmlnU25hcHNob3QgPSB7XG4gICAgICAgIHRpbWU6IGV2ZW50LnRpbWUsXG4gICAgICAgIG5hbWU6IGV2ZW50LnRleHQsXG4gICAgICAgIGRldmljZVR5cGU6IGRldmljZS50eXBlLFxuICAgICAgICBjb25maWd1cmF0aW9uVHlwZVxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZ1NuYXBzaG90LmJpbmFyeSA9IGF3YWl0IChhd2FpdCB0aGlzLmV2ZW50QmluYXJ5LmRvd25sb2FkKGV2ZW50KSkudGV4dCgpO1xuICAgICAgICBpZiAoZXZlbnQuYzh5X0lzQmluYXJ5KSB7XG4gICAgICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5VHlwZSA9IGV2ZW50LmM4eV9Jc0JpbmFyeS50eXBlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBjb25zdCBtc2cgPSBnZXR0ZXh0KCdDb3VsZCBub3QgZ2V0IHRoZSBiaW5hcnkuJyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWdTbmFwc2hvdDtcbiAgfVxuXG4gIGFzeW5jIGdldExlZ2FjeUNvbmZpZ1NuYXBzaG90KGRldmljZUlkKSB7XG4gICAgbGV0IGNvbmZpZ1NuYXBzaG90OiBDb25maWd1cmF0aW9uU25hcHNob3Q7XG4gICAgbGV0IG1vO1xuICAgIGNvbnN0IGRldmljZSA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoZGV2aWNlSWQsIHsgd2l0aENoaWxkcmVuOiBmYWxzZSB9KSkuZGF0YTtcbiAgICBjb25zdCBzbmFwc2hvdElkID0gZGV2aWNlLmM4eV9Db25maWd1cmF0aW9uRHVtcCAmJiBkZXZpY2UuYzh5X0NvbmZpZ3VyYXRpb25EdW1wLmlkO1xuICAgIGlmICghc25hcHNob3RJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBtbyA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoc25hcHNob3RJZCkpLmRhdGE7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgaWYgKG1vKSB7XG4gICAgICBjb25maWdTbmFwc2hvdCA9IHtcbiAgICAgICAgdGltZTogbW8uY3JlYXRpb25UaW1lLFxuICAgICAgICBuYW1lOiBtby5uYW1lXG4gICAgICB9O1xuICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5ID0gYXdhaXQgdGhpcy5nZXRCaW5hcnlUZXh0KG1vLnVybCwgeyBhbGxvd0V4dGVybmFsOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1NuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0IGFzIHRleHQuXG4gICAqIEBwYXJhbSBiaW5hcnlVcmwgVGhlIFVSTCB0byBmaW5kIGJpbmFyeVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb2JqZWN0IHdpdGggYWRkaXRpb25hbCBvcHRpb25zOlxuICAgKiAtICoqYWxsb3dFeHRlcm5hbCoqIC0gYGJvb2xlYW5gIC0gYWxsb3dzIGRvd25sb2FkaW5nIGV4dGVybmFsIGJpbmFyeSBmaWxlXG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgYXN5bmMgZ2V0QmluYXJ5VGV4dChcbiAgICBiaW5hcnlVcmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGFsbG93RXh0ZXJuYWw6IGJvb2xlYW47IG5vQWxlcnRzPzogYm9vbGVhbiB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIGlmIChvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJpbmFyeSBvYmplY3QgYXMgRmlsZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKiphbGxvd0V4dGVybmFsKiogLSBgYm9vbGVhbmAgLSBhbGxvd3MgZG93bmxvYWRpbmcgZXh0ZXJuYWwgYmluYXJ5IGZpbGVcbiAgICovXG4gIGFzeW5jIGdldEJpbmFyeUZpbGUoYmluYXJ5VXJsOiBzdHJpbmcsIG9wdGlvbnM6IHsgYWxsb3dFeHRlcm5hbDogYm9vbGVhbiB9KTogUHJvbWlzZTxGaWxlPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBpZiAoIWJpbmFyeUlkICYmICFvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBAVE9ETzogbm90ZSB0aGF0IGl0IGRvZXNuJ3Qgc29sdmUgaXNzdWUgd2l0aCBleHRlcm5hbCBiaW5hcnkgaGVyZSwgc3VjaCB1cmwgd29uJ3QgaGF2ZSBiaW5hcnlJZCwgc28gd2Ugd29uJ3Qga25vdyB0aGUgbmFtZSBvciBjb250ZW50VHlwZSB0byB1c2UgaW4gRmlsZSBjb25zdHJ1Y3RvciwgbGV0J3MgYWRkIGEgQEZJWE1FIGNvbW1lbnQgZm9yIG5vdz9cbiAgICBjb25zdCB7IG5hbWUsIGNvbnRlbnRUeXBlIH0gPSAoYXdhaXQgdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKSkuZGF0YTtcbiAgICBjb25zdCByZXMgPSAhIWJpbmFyeUlkXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZClcbiAgICAgIDogYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCk7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gbmV3IEZpbGUoW2FycmF5QnVmZmVyXSwgbmFtZSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXN0IGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0NvbmZpZ3VyYXRpb24gYW5kIGM4eV9TZW5kQ29uZmlndXJhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdENvbmZpZ1VwZGF0ZU9wZXJhdGlvbihkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZGF0ZUZyb206IG5ldyBEYXRlKDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBkYXRlVG86IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXZlcnQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGF0ZXN0TWF0Y2hpbmdPcGVyYXRpb24oW1xuICAgICAgeyAuLi5maWx0ZXJzLCBmcmFnbWVudFR5cGU6ICdjOHlfQ29uZmlndXJhdGlvbicgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NlbmRDb25maWd1cmF0aW9uJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBpdHMgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBTdXBwb3J0cyBjOHlfU2VuZENvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqL1xuICBjcmVhdGVUZXh0QmFzZWRDb25maWd1cmF0aW9uUmVsb2FkT3BlcmF0aW9uKGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdSZXF1ZXN0ZWQgY3VycmVudCBjb25maWd1cmF0aW9uJyksXG4gICAgICBjOHlfU2VuZENvbmZpZ3VyYXRpb246IHt9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogU3VwcG9ydHMgYzh5X0NvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gd2hpY2ggd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIG9uZS5cbiAgICovXG4gIGNyZWF0ZVRleHRCYXNlZENvbmZpZ3VyYXRpb25VcGRhdGVPcGVyYXRpb24oZGV2aWNlOiBJTWFuYWdlZE9iamVjdCwgY29uZmlnOiBzdHJpbmcpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIHVwZGF0ZScpLFxuICAgICAgYzh5X0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgY29uZmlnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEJpbmFyeShiaW5hcnlJZDogSWRSZWZlcmVuY2UpOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kb3dubG9hZChiaW5hcnlJZCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGF2YWlsYWJsZSBzbmFwc2hvdHMgZnJvbSB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgc25hcHNob3RzIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICovXG4gIGFzeW5jIGdldFNuYXBzaG90c0Zyb21SZXBvc2l0b3J5KGRldmljZSwgY29uZmlndXJhdGlvblR5cGUpIHtcbiAgICBjb25zdCBzZWFyY2hRdWVyeSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2UsIGNvbmZpZ3VyYXRpb25UeXBlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxpc3RSZXBvc2l0b3J5RW50cmllcyhSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OLCB7XG4gICAgICBxdWVyeTogc2VhcmNoUXVlcnksXG4gICAgICBwYXJhbXM6IHsgcGFnZVNpemU6IDEwMCB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRldmljZSBhbHJlYWR5IGhhdmUgYSBnaXZlbiBzb2Z0d2FyZSBpbnN0YWxsZWRcbiAgICogQHBhcmFtIGRldmljZUlkIElkIG9mIHRoZSBkZXZpY2UgdG8gYmUgY2hlY2tlZFxuICAgKiBAcGFyYW0gc29mdHdhcmUgVGhlIHNvZnR3YXJlIHRvIGJlIGNoZWNrZWRcbiAgICovXG4gIGFzeW5jIGlzU29mdHdhcmVJbnN0YWxsZWRPbkRldmljZShcbiAgICBkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHNvZnR3YXJlOiBEZXZpY2VTb2Z0d2FyZVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlLmlzQVNNQXZhaWxhYmxlKCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlGaWx0ZXIgPSB7IGRldmljZUlkIH07XG4gICAgaWYgKHNvZnR3YXJlPy5uYW1lKSB7XG4gICAgICBzZXQocXVlcnlGaWx0ZXIsICduYW1lJywgc29mdHdhcmUubmFtZSk7XG4gICAgfVxuICAgIGlmIChzb2Z0d2FyZT8udmVyc2lvbikge1xuICAgICAgc2V0KHF1ZXJ5RmlsdGVyLCAndmVyc2lvbicsIHNvZnR3YXJlLnZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KHF1ZXJ5RmlsdGVyKS50aGVuKHJlc3VsdCA9PiAhIXJlc3VsdC5kYXRhPy5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0LlxuICAgKiBAcGFyYW0gYmluYXJ5SWQgYmluYXJ5IElEXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRJbnRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeUlkOiBJZFJlZmVyZW5jZSxcbiAgICBvcHRpb25zOiB7IG5vQWxlcnRzPzogYm9vbGVhbiB9ID0ge31cbiAgKTogUHJvbWlzZTxJRmV0Y2hSZXNwb25zZT4ge1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmRvd25sb2FkKGJpbmFyeUlkKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKCFvcHRpb25zLm5vQWxlcnRzKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgICAgdGhpcy5hbGVydC5kYW5nZXIobXNnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYmluYXJ5IG9iamVjdC5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeVVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgbm9BbGVydHM/OiBib29sZWFuIH0gPSB7fVxuICApOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmV0Y2hSZXMgPSBhd2FpdCBmZXRjaChiaW5hcnlVcmwpO1xuICAgICAgaWYgKGZldGNoUmVzLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgdGhyb3cgcmVzO1xuICAgICAgfVxuICAgICAgcmVzID0gZmV0Y2hSZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICBpZiAoIW9wdGlvbnMubm9BbGVydHMpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnQ291bGQgbm90IGdldCB0aGUgZXh0ZXJuYWwgYmluYXJ5Jyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGdldEJhc2VWZXJzaW9uUmVzdWx0TGlzdEZvckxlZ2FjeUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICByZXM6IHt9IGFzIElGZXRjaFJlc3BvbnNlLFxuICAgICAgZGF0YTogW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgW2VudHJ5LnR5cGVdOiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBlbnRyeS51cmxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9IGFzIElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21Tb2Z0d2FyZUxpc3RPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uLFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPiB7XG4gICAgY29uc3QgY2hhbmdlczogRGV2aWNlU29mdHdhcmVDaGFuZ2VbXSA9IFtdO1xuICAgIGNvbnN0IGRldmljZVNvZnR3YXJlTGlzdCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCBbXSk7XG4gICAgZm9yRWFjaChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgb3BlcmF0aW9uU29mdHdhcmUgPT4ge1xuICAgICAgY29uc3QgZGV2aWNlU29mdHdhcmUgPSBmaW5kKGRldmljZVNvZnR3YXJlTGlzdCwgeyBuYW1lOiBvcGVyYXRpb25Tb2Z0d2FyZS5uYW1lIH0pO1xuICAgICAgaWYgKFxuICAgICAgICAob3BlcmF0aW9uU29mdHdhcmUgJiYgb3BlcmF0aW9uU29mdHdhcmUudmVyc2lvbikgIT09XG4gICAgICAgIChkZXZpY2VTb2Z0d2FyZSAmJiBkZXZpY2VTb2Z0d2FyZS52ZXJzaW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uU29mdHdhcmUsXG4gICAgICAgICAgYWN0aW9uOiAnaW5zdGFsbCdcbiAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yRWFjaChkZXZpY2VTb2Z0d2FyZUxpc3QsIGRldmljZVNvZnR3YXJlID0+IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvblNvZnR3YXJlID0gZmluZChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgeyBuYW1lOiBkZXZpY2VTb2Z0d2FyZS5uYW1lIH0pO1xuICAgICAgaWYgKFxuICAgICAgICAob3BlcmF0aW9uU29mdHdhcmUgJiYgb3BlcmF0aW9uU29mdHdhcmUudmVyc2lvbikgIT09XG4gICAgICAgIChkZXZpY2VTb2Z0d2FyZSAmJiBkZXZpY2VTb2Z0d2FyZS52ZXJzaW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxDaGFuZ2UgPSBjaGFuZ2VzLmZpbmQoXG4gICAgICAgICAgY2hhbmdlID0+IGRldmljZVNvZnR3YXJlLm5hbWUgPT09IGNoYW5nZS5uYW1lICYmIGNoYW5nZS5hY3Rpb24gPT09ICdpbnN0YWxsJ1xuICAgICAgICApO1xuICAgICAgICAvLyBjaGVjayB0aGF0IHRoaXMgc29mdHdhcmUgaXMgbm90IGFuIGluc3RhbGxhdGlvbiBzb2Z0d2FyZSBjaGFuZ2UsIG90aGVyd2lzZSBpdCdzIGFuIHVwZGF0ZSBhbmQgbm90IGEgcmVtb3ZhbFxuICAgICAgICBpZiAoIWluc3RhbGxDaGFuZ2UpIHtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgLi4uZGV2aWNlU29mdHdhcmUsXG4gICAgICAgICAgICBhY3Rpb246ICdkZWxldGUnXG4gICAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0RGV2aWNlU29mdHdhcmVDaGFuZ2VzRnJvbVNvZnR3YXJlT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogSU9wZXJhdGlvbixcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0XG4gICk6IFByb21pc2U8RGV2aWNlU29mdHdhcmVDaGFuZ2VbXT4ge1xuICAgIGNvbnN0IGNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW10gPSBbXTtcbiAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZScsIHt9KTtcbiAgICBmb3JFYWNoKGRldmljZVNvZnR3YXJlLCAoZGV2aWNlU29mdHdhcmVWZXJzaW9uLCBkZXZpY2VTb2Z0d2FyZU5hbWUpID0+IHtcbiAgICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlW2RldmljZVNvZnR3YXJlTmFtZV0gIT09IGRldmljZVNvZnR3YXJlVmVyc2lvbikge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGRldmljZVNvZnR3YXJlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBkZXZpY2VTb2Z0d2FyZVZlcnNpb24sXG4gICAgICAgICAgYWN0aW9uOiAnZGVsZXRlJ1xuICAgICAgICB9IGFzIERldmljZVNvZnR3YXJlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3JFYWNoKG9wZXJhdGlvbi5jOHlfU29mdHdhcmUsIChvcGVyYXRpb25Tb2Z0d2FyZVZlcnNpb24sIG9wZXJhdGlvblNvZnR3YXJlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZGV2aWNlU29mdHdhcmVWZXJzaW9uID0gZGV2aWNlU29mdHdhcmUgJiYgZGV2aWNlU29mdHdhcmVbb3BlcmF0aW9uU29mdHdhcmVOYW1lXTtcbiAgICAgIGlmIChkZXZpY2VTb2Z0d2FyZVZlcnNpb24gIT09IG9wZXJhdGlvblNvZnR3YXJlVmVyc2lvbikge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IG9wZXJhdGlvblNvZnR3YXJlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBvcGVyYXRpb25Tb2Z0d2FyZVZlcnNpb24sXG4gICAgICAgICAgYWN0aW9uOiAnaW5zdGFsbCdcbiAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEN1cnJlbnRTb2Z0d2FyZShcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIHN3RnJhZ21lbnQ6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IG9iamVjdFxuICApOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IGlzQVNNQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5pc0FTTUF2YWlsYWJsZSgpO1xuICAgIGlmIChpc0FTTUF2YWlsYWJsZSkge1xuICAgICAgbGV0IHNvZnR3YXJlUmVzdWx0TGlzdDogSVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+ID0gYXdhaXQgdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KFxuICAgICAgICB7IGRldmljZUlkOiBkZXZpY2UuaWQsIHBhZ2VTaXplOiAxMDAgfVxuICAgICAgKTtcbiAgICAgIGxldCBsaXN0ID0gKHNvZnR3YXJlUmVzdWx0TGlzdD8uZGF0YSB8fCBbXSkubWFwKHN3ID0+XG4gICAgICAgIHBpY2sob21pdEJ5KHN3LCBpc05pbCksIFsnbmFtZScsICd2ZXJzaW9uJywgJ3VybCcsICdzb2Z0d2FyZVR5cGUnXSlcbiAgICAgICk7XG5cbiAgICAgIHdoaWxlIChzb2Z0d2FyZVJlc3VsdExpc3QucGFnaW5nPy5uZXh0UGFnZSkge1xuICAgICAgICBzb2Z0d2FyZVJlc3VsdExpc3QgPSBhd2FpdCBzb2Z0d2FyZVJlc3VsdExpc3QucGFnaW5nLm5leHQoKTtcbiAgICAgICAgbGlzdCA9IFtcbiAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgIC4uLihzb2Z0d2FyZVJlc3VsdExpc3Q/LmRhdGEgfHwgW10pLm1hcChzdyA9PlxuICAgICAgICAgICAgcGljayhvbWl0Qnkoc3csIGlzTmlsKSwgWyduYW1lJywgJ3ZlcnNpb24nLCAndXJsJywgJ3NvZnR3YXJlVHlwZSddKVxuICAgICAgICAgIClcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGxpc3QgOiB0aGlzLnNvZnR3YXJlTGlzdFRvTGVnYWN5KGxpc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGV2aWNlW3N3RnJhZ21lbnRdIHx8IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNvZnR3YXJlTGlzdFRvTGVnYWN5KGxpc3Q6IElNYW5hZ2VkT2JqZWN0W10pOiBvYmplY3Qge1xuICAgIHJldHVybiAobGlzdCB8fCBbXSkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3Vyci5uYW1lXTogY3Vyci52ZXJzaW9uIH0pLCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEdsb2JhbEZyYWdtZW50KHR5cGU6IFJlcG9zaXRvcnlUeXBlKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdsb2JhbENvbmZpZ1NlcnZpY2UuZ2V0R2xvYmFsUGFyYW0odHlwZSkpID8geyBjOHlfR2xvYmFsOiB7fSB9IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVPdXRkYXRlZEJpbmFyeShuZXdCaW5hcnlVUkwsIG9sZEJpbmFyeVVSTCkge1xuICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5SWQgPSBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21Vcmwob2xkQmluYXJ5VVJMKTtcbiAgICBjb25zdCBuZXdCaW5hcnlJZCA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybChuZXdCaW5hcnlVUkwpO1xuICAgIGlmIChleGlzdGluZ0JpbmFyeUlkICYmIGV4aXN0aW5nQmluYXJ5SWQgIT09IG5ld0JpbmFyeUlkKSB7XG4gICAgICBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kZWxldGUoZXhpc3RpbmdCaW5hcnlJZCk7XG4gICAgfVxuICB9XG59XG4iXX0=