@tiba-spark/client-shared-lib 26.2.0-381 → 26.2.0-382

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.
@@ -13,26 +13,34 @@ export class BaseDeviceItemComponent extends BaseComponent {
13
13
  this.store = store;
14
14
  this.deviceService = deviceService;
15
15
  this.cdr = cdr;
16
+ /**
17
+ * SPRK3-14693: whether the indicator is shown now depends on deviceStatus.laneRecognition, which
18
+ * arrives at runtime - an LPR camera that has not reported yet reports one later. So it has to be
19
+ * refreshed alongside the status, not computed once in ngOnInit as the device type used to be.
20
+ */
21
+ this.populateStatusIndicator = () => {
22
+ this.isStatusSupported = this.deviceService.isStatusSupportedForDevice(this.device);
23
+ this.populateComAggregatedStatus();
24
+ };
16
25
  this.populateComAggregatedStatus = () => {
17
- this.comAggregatedStatus = this.deviceService.getDeviceComAggregatedStatus(this.device.deviceStatus);
26
+ this.comAggregatedStatus = this.deviceService.getComAggregatedStatusForDevice(this.device);
18
27
  };
19
28
  }
20
29
  ngOnChanges(changes) {
21
30
  if (changes.device) {
22
- this.populateComAggregatedStatus();
31
+ this.populateStatusIndicator();
23
32
  }
24
33
  }
25
34
  ngOnInit() {
26
35
  this.isVirtualDevice = this.device?.isVirtual ?? false;
27
36
  this.activeStatus = isDeviceDisplayedActive(this.device);
28
37
  this.isMultiPark = !!this.store.selectSnapshot(FacilityState.isMultiPark);
29
- this.isStatusSupported = this.deviceService.isStatusSupported(this.device.type);
30
- this.populateComAggregatedStatus();
38
+ this.populateStatusIndicator();
31
39
  // Only MC is being updated with this, other devices have events for themselves
32
40
  if (this.device.commID === 0) {
33
41
  const guid = this.store.selectSnapshot(FacilityState.guid);
34
42
  this.store.select(FacilityState.parkConnectionStatusMap).pipe(takeUntil(this.destroy$), filter((connectionMap) => !!connectionMap[guid] && !!this.device), distinctUntilChanged((prev, curr) => prev[guid][this.device.parkID]?.status === curr[guid][this.device.parkID]?.status)).subscribe(() => {
35
- this.populateComAggregatedStatus();
43
+ this.populateStatusIndicator();
36
44
  this.cdr.detectChanges();
37
45
  });
38
46
  }
@@ -48,4 +56,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48
56
  }], ctorParameters: () => [{ type: i1.Store }, { type: i2.BaseDeviceService }, { type: i0.ChangeDetectorRef }], propDecorators: { device: [{
49
57
  type: Input
50
58
  }] } });
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXNoYXJlZC1saWIvc3JjL2xpYnJhcmllcy9jb21wb25lbnRzL2RldmljZS9kZXZpY2UtaXRlbS9kZXZpY2UtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFFL0gsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBVzFELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxhQUFhO0lBVXhELFlBQXNCLEtBQVksRUFBWSxhQUFnQyxFQUFZLEdBQXNCO1FBQzlHLEtBQUssRUFBRSxDQUFDO1FBRFksVUFBSyxHQUFMLEtBQUssQ0FBTztRQUFZLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUFZLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBZ0N0RyxnQ0FBMkIsR0FBRyxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RyxDQUFDLENBQUM7SUFoQ0YsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUVuQywrRUFBK0U7UUFDL0UsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUMzRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFDakUsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQ3hILENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOytHQXhDVSx1QkFBdUI7bUdBQXZCLHVCQUF1QixrSkFSeEIsRUFBRSwrMUJBS1YsWUFBWTs7NEZBR0gsdUJBQXVCO2tCQVRuQyxTQUFTOytCQUNFLEVBQUUsbUJBRUssdUJBQXVCLENBQUMsT0FBTyxjQUNwQyxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTtxQkFDYjswSUFJUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21BZ2dyZWdhdGVkU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMvYWdncmVnYXRlZC1zdGF0dXMuZW51bSc7XG5pbXBvcnQgeyBGYWNpbGl0eVN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vbW9kdWxlcy9mYWNpbGl0eS9mYWNpbGl0eS5zdGF0ZSc7XG5pbXBvcnQgeyBEZXZpY2VEdG8gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlLXByb3h5L3JwYy1zZXJ2aWNlLXByb3hpZXMnO1xuaW1wb3J0IHsgQmFzZURldmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9iYXNlLWRldmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IGlzRGV2aWNlRGlzcGxheWVkQWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYWN0aXZlLWRldmljZS1zdGF0dXMudXRpbCc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS9iYXNlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogJycsXG4gIHN0eWxlVXJsczogWycuL2RldmljZS1pdGVtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEJhc2VEZXZpY2VJdGVtQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkZXZpY2U6IERldmljZUR0bztcblxuICBpc011bHRpUGFyazogYm9vbGVhbjtcbiAgaXNWaXJ0dWFsRGV2aWNlOiBib29sZWFuO1xuICBhY3RpdmVTdGF0dXM6IGJvb2xlYW47XG4gIGlzU3RhdHVzU3VwcG9ydGVkOiBib29sZWFuO1xuICBjb21BZ2dyZWdhdGVkU3RhdHVzOiBDb21BZ2dyZWdhdGVkU3RhdHVzO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yZTogU3RvcmUsIHByb3RlY3RlZCBkZXZpY2VTZXJ2aWNlOiBCYXNlRGV2aWNlU2VydmljZSwgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmRldmljZSkge1xuICAgICAgdGhpcy5wb3B1bGF0ZUNvbUFnZ3JlZ2F0ZWRTdGF0dXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzVmlydHVhbERldmljZSA9IHRoaXMuZGV2aWNlPy5pc1ZpcnR1YWwgPz8gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVTdGF0dXMgPSBpc0RldmljZURpc3BsYXllZEFjdGl2ZSh0aGlzLmRldmljZSk7XG4gICAgdGhpcy5pc011bHRpUGFyayA9ICEhdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmlzTXVsdGlQYXJrKTtcbiAgICB0aGlzLmlzU3RhdHVzU3VwcG9ydGVkID0gdGhpcy5kZXZpY2VTZXJ2aWNlLmlzU3RhdHVzU3VwcG9ydGVkKHRoaXMuZGV2aWNlLnR5cGUpO1xuICAgIHRoaXMucG9wdWxhdGVDb21BZ2dyZWdhdGVkU3RhdHVzKCk7XG5cbiAgICAvLyBPbmx5IE1DIGlzIGJlaW5nIHVwZGF0ZWQgd2l0aCB0aGlzLCBvdGhlciBkZXZpY2VzIGhhdmUgZXZlbnRzIGZvciB0aGVtc2VsdmVzXG4gICAgaWYgKHRoaXMuZGV2aWNlLmNvbW1JRCA9PT0gMCkge1xuICAgICAgY29uc3QgZ3VpZCA9IHRoaXMuc3RvcmUuc2VsZWN0U25hcHNob3QoRmFjaWxpdHlTdGF0ZS5ndWlkKTtcblxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRmFjaWxpdHlTdGF0ZS5wYXJrQ29ubmVjdGlvblN0YXR1c01hcCkucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKGNvbm5lY3Rpb25NYXApID0+ICEhY29ubmVjdGlvbk1hcFtndWlkXSAmJiAhIXRoaXMuZGV2aWNlKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IHByZXZbZ3VpZF1bdGhpcy5kZXZpY2UucGFya0lEXT8uc3RhdHVzID09PSBjdXJyW2d1aWRdW3RoaXMuZGV2aWNlLnBhcmtJRF0/LnN0YXR1cylcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUNvbUFnZ3JlZ2F0ZWRTdGF0dXMoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHBvcHVsYXRlQ29tQWdncmVnYXRlZFN0YXR1cyA9ICgpID0+IHtcbiAgICB0aGlzLmNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSB0aGlzLmRldmljZVNlcnZpY2UuZ2V0RGV2aWNlQ29tQWdncmVnYXRlZFN0YXR1cyh0aGlzLmRldmljZS5kZXZpY2VTdGF0dXMpO1xuICB9O1xufVxuIl19
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXNoYXJlZC1saWIvc3JjL2xpYnJhcmllcy9jb21wb25lbnRzL2RldmljZS9kZXZpY2UtaXRlbS9kZXZpY2UtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFFL0gsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBVzFELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxhQUFhO0lBVXhELFlBQXNCLEtBQVksRUFBWSxhQUFnQyxFQUFZLEdBQXNCO1FBQzlHLEtBQUssRUFBRSxDQUFDO1FBRFksVUFBSyxHQUFMLEtBQUssQ0FBTztRQUFZLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUFZLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBK0JoSDs7OztXQUlHO1FBQ08sNEJBQXVCLEdBQUcsR0FBRyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFFUSxnQ0FBMkIsR0FBRyxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdGLENBQUMsQ0FBQztJQXpDRixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUUvQiwrRUFBK0U7UUFDL0UsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUMzRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFDakUsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQ3hILENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOytHQXZDVSx1QkFBdUI7bUdBQXZCLHVCQUF1QixrSkFSeEIsRUFBRSwrMUJBS1YsWUFBWTs7NEZBR0gsdUJBQXVCO2tCQVRuQyxTQUFTOytCQUNFLEVBQUUsbUJBRUssdUJBQXVCLENBQUMsT0FBTyxjQUNwQyxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTtxQkFDYjswSUFJUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21BZ2dyZWdhdGVkU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMvYWdncmVnYXRlZC1zdGF0dXMuZW51bSc7XG5pbXBvcnQgeyBGYWNpbGl0eVN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vbW9kdWxlcy9mYWNpbGl0eS9mYWNpbGl0eS5zdGF0ZSc7XG5pbXBvcnQgeyBEZXZpY2VEdG8gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlLXByb3h5L3JwYy1zZXJ2aWNlLXByb3hpZXMnO1xuaW1wb3J0IHsgQmFzZURldmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9iYXNlLWRldmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IGlzRGV2aWNlRGlzcGxheWVkQWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYWN0aXZlLWRldmljZS1zdGF0dXMudXRpbCc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS9iYXNlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogJycsXG4gIHN0eWxlVXJsczogWycuL2RldmljZS1pdGVtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEJhc2VEZXZpY2VJdGVtQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkZXZpY2U6IERldmljZUR0bztcblxuICBpc011bHRpUGFyazogYm9vbGVhbjtcbiAgaXNWaXJ0dWFsRGV2aWNlOiBib29sZWFuO1xuICBhY3RpdmVTdGF0dXM6IGJvb2xlYW47XG4gIGlzU3RhdHVzU3VwcG9ydGVkOiBib29sZWFuO1xuICBjb21BZ2dyZWdhdGVkU3RhdHVzOiBDb21BZ2dyZWdhdGVkU3RhdHVzO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yZTogU3RvcmUsIHByb3RlY3RlZCBkZXZpY2VTZXJ2aWNlOiBCYXNlRGV2aWNlU2VydmljZSwgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmRldmljZSkge1xuICAgICAgdGhpcy5wb3B1bGF0ZVN0YXR1c0luZGljYXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNWaXJ0dWFsRGV2aWNlID0gdGhpcy5kZXZpY2U/LmlzVmlydHVhbCA/PyBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZVN0YXR1cyA9IGlzRGV2aWNlRGlzcGxheWVkQWN0aXZlKHRoaXMuZGV2aWNlKTtcbiAgICB0aGlzLmlzTXVsdGlQYXJrID0gISF0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KEZhY2lsaXR5U3RhdGUuaXNNdWx0aVBhcmspO1xuICAgIHRoaXMucG9wdWxhdGVTdGF0dXNJbmRpY2F0b3IoKTtcblxuICAgIC8vIE9ubHkgTUMgaXMgYmVpbmcgdXBkYXRlZCB3aXRoIHRoaXMsIG90aGVyIGRldmljZXMgaGF2ZSBldmVudHMgZm9yIHRoZW1zZWx2ZXNcbiAgICBpZiAodGhpcy5kZXZpY2UuY29tbUlEID09PSAwKSB7XG4gICAgICBjb25zdCBndWlkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChGYWNpbGl0eVN0YXRlLnBhcmtDb25uZWN0aW9uU3RhdHVzTWFwKS5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGZpbHRlcigoY29ubmVjdGlvbk1hcCkgPT4gISFjb25uZWN0aW9uTWFwW2d1aWRdICYmICEhdGhpcy5kZXZpY2UpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gcHJldltndWlkXVt0aGlzLmRldmljZS5wYXJrSURdPy5zdGF0dXMgPT09IGN1cnJbZ3VpZF1bdGhpcy5kZXZpY2UucGFya0lEXT8uc3RhdHVzKVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnBvcHVsYXRlU3RhdHVzSW5kaWNhdG9yKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTUFJLMy0xNDY5Mzogd2hldGhlciB0aGUgaW5kaWNhdG9yIGlzIHNob3duIG5vdyBkZXBlbmRzIG9uIGRldmljZVN0YXR1cy5sYW5lUmVjb2duaXRpb24sIHdoaWNoXG4gICAqIGFycml2ZXMgYXQgcnVudGltZSAtIGFuIExQUiBjYW1lcmEgdGhhdCBoYXMgbm90IHJlcG9ydGVkIHlldCByZXBvcnRzIG9uZSBsYXRlci4gU28gaXQgaGFzIHRvIGJlXG4gICAqIHJlZnJlc2hlZCBhbG9uZ3NpZGUgdGhlIHN0YXR1cywgbm90IGNvbXB1dGVkIG9uY2UgaW4gbmdPbkluaXQgYXMgdGhlIGRldmljZSB0eXBlIHVzZWQgdG8gYmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcG9wdWxhdGVTdGF0dXNJbmRpY2F0b3IgPSAoKSA9PiB7XG4gICAgdGhpcy5pc1N0YXR1c1N1cHBvcnRlZCA9IHRoaXMuZGV2aWNlU2VydmljZS5pc1N0YXR1c1N1cHBvcnRlZEZvckRldmljZSh0aGlzLmRldmljZSk7XG4gICAgdGhpcy5wb3B1bGF0ZUNvbUFnZ3JlZ2F0ZWRTdGF0dXMoKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgcG9wdWxhdGVDb21BZ2dyZWdhdGVkU3RhdHVzID0gKCkgPT4ge1xuICAgIHRoaXMuY29tQWdncmVnYXRlZFN0YXR1cyA9IHRoaXMuZGV2aWNlU2VydmljZS5nZXRDb21BZ2dyZWdhdGVkU3RhdHVzRm9yRGV2aWNlKHRoaXMuZGV2aWNlKTtcbiAgfTtcbn1cbiJdfQ==
@@ -9,7 +9,7 @@ import { DeviceIndicationStatus } from '../enums/device-indication-status.enum';
9
9
  import { Localization } from '../enums/localization.enum';
10
10
  import { FacilityState } from '../modules/facility/facility.state';
11
11
  import { ParkManagerState } from '../modules/park-manager/park-manager.state';
12
- import { AggregatedStatus, BarrierState, ChangeDeviceAccessModeRemoteCommandData, CloseGateContinuouslyRemoteCommandData, CloseGateRemoteCommandData, ClosePaymentScreenRemoteCommandData, CloseTicketForISFRemoteCommandData, CommProtocolType, DeliverBundleBillsRemoteCommandData, DeviceType, EjectJammedTicketRemoteCommandData, HoldRelayRemoteCommandData, InsertVirtualTicketRemoteCommandData, LockCashRegisterRemoteCommandData, OpenGateContinuouslyRemoteCommandData, OpenRelayRemoteCommandData, PrintTicketRemoteCommandData, RemoteCommandBase, RemoteCommandDevicePayload, RemoteCommandTypes, ResetBillDispenserRemoteCommandData, ResetDeviceAccessModeRemoteCommandData, RestartDeviceRemoteCommandData, SetPriceRemoteCommandData, SetRateRemoteCommandData, SwallowJammedTicketRemoteCommandData, SwallowUnitStatus, SwallowUnitType, TriggerLprRemoteCommandData, TypeCast, UnlockDoorRemoteCommandData, ValidateRemoteCommandData, VendGateRemoteCommandData } from '../service-proxy/rpc-service-proxies';
12
+ import { AggregatedStatus, BarrierState, ChangeDeviceAccessModeRemoteCommandData, CloseGateContinuouslyRemoteCommandData, CloseGateRemoteCommandData, ClosePaymentScreenRemoteCommandData, CloseTicketForISFRemoteCommandData, CommProtocolType, DeliverBundleBillsRemoteCommandData, DeviceType, EjectJammedTicketRemoteCommandData, HoldRelayRemoteCommandData, InsertVirtualTicketRemoteCommandData, LaneRecognitionStatusType, LockCashRegisterRemoteCommandData, OpenGateContinuouslyRemoteCommandData, OpenRelayRemoteCommandData, PrintTicketRemoteCommandData, RemoteCommandBase, RemoteCommandDevicePayload, RemoteCommandTypes, ResetBillDispenserRemoteCommandData, ResetDeviceAccessModeRemoteCommandData, RestartDeviceRemoteCommandData, SetPriceRemoteCommandData, SetRateRemoteCommandData, SwallowJammedTicketRemoteCommandData, SwallowUnitStatus, SwallowUnitType, TriggerLprRemoteCommandData, TypeCast, UnlockDoorRemoteCommandData, ValidateRemoteCommandData, VendGateRemoteCommandData } from '../service-proxy/rpc-service-proxies';
13
13
  import { isDeviceDisplayedActive } from '../utils/active-device-status.util';
14
14
  import * as i0 from "@angular/core";
15
15
  import * as i1 from "@ngxs/store";
@@ -406,6 +406,33 @@ export class BaseDeviceService {
406
406
  }
407
407
  return value;
408
408
  }
409
+ /**
410
+ * SPRK3-14693: a virtual device has no hardware communication link, so a communication status is
411
+ * meaningless for it. The one exception is a Fencer LPR camera, which reports a real state through
412
+ * deviceStatus.laneRecognition. These two decide, for a whole device, whether a status indicator is
413
+ * shown and what colour it takes - unlike isStatusSupported/getDeviceComAggregatedStatus, which see
414
+ * only the type or the status DTO and so cannot tell a virtual device apart.
415
+ */
416
+ isStatusSupportedForDevice(device) {
417
+ return device?.isVirtual
418
+ ? !!this.getLaneRecognitionComAggregatedStatus(device)
419
+ : this.isStatusSupported(device?.type);
420
+ }
421
+ getComAggregatedStatusForDevice(device) {
422
+ return device?.isVirtual
423
+ ? this.getLaneRecognitionComAggregatedStatus(device)
424
+ : this.getDeviceComAggregatedStatus(device?.deviceStatus);
425
+ }
426
+ /**
427
+ * Reads the same app-settings deviceStatusMapping.LaneRecognition the LPR tag on the device page
428
+ * uses (Active 1, SemiActive 2, NoActive 3), which lands on ComAggregatedStatus Ok / Warning /
429
+ * Error: green / yellow / red. Undefined for a camera that has not reported an LPR state yet -
430
+ * which is what makes isStatusSupportedForDevice false for it, so the two always agree.
431
+ */
432
+ getLaneRecognitionComAggregatedStatus(device) {
433
+ const laneRecognitionStatus = device?.deviceStatus?.laneRecognition?.status;
434
+ return this.appSettingsService.deviceStatusMapping.LaneRecognition[LaneRecognitionStatusType[laneRecognitionStatus]];
435
+ }
409
436
  getDeviceComAggregatedStatus(deviceStatusData, isComStatus = false) {
410
437
  // If the device is an MC (commid === 0) we need to translate the Park connection instead of the Device
411
438
  let comAggregatedStatus;
@@ -440,11 +467,13 @@ export class BaseDeviceService {
440
467
  // SPRK3-14608: a virtual device keeps its real communication status class instead of the
441
468
  // inactive one. The device detail page passes this class into tb-virtual-device, which
442
469
  // applies it to the panel header border.
470
+ // SPRK3-14693: which status that is has to follow the same per-device rule as the indicator,
471
+ // or a virtual device with no communication link still gets a com-error border here.
443
472
  if (!isDeviceDisplayedActive(device)) {
444
473
  statusClasses.push('inactive');
445
474
  }
446
- else if (this.isStatusSupported(device?.type)) {
447
- const deviceAggregatedStatus = this.getDeviceComAggregatedStatus(device.deviceStatus);
475
+ else if (this.isStatusSupportedForDevice(device)) {
476
+ const deviceAggregatedStatus = this.getComAggregatedStatusForDevice(device);
448
477
  statusClasses.push(ComAggregatedStatus[deviceAggregatedStatus].toLowerCase());
449
478
  }
450
479
  return statusClasses.join(" ");
@@ -522,4 +551,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
522
551
  }], ctorParameters: () => [{ type: i1.Store }, { type: i2.TranslateService }, { type: i3.RemoteCommandService }, { type: i4.AppSettingsService }, { type: i5.CommandNotificationService }], propDecorators: { loadingCommand$: [{
523
552
  type: Output
524
553
  }] } });
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kZXZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1zaGFyZWQtbGliL3NyYy9saWJyYXJpZXMvc2VydmljZXMvYmFzZS1kZXZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHakUsT0FBTyxFQUF3QyxFQUFFLEVBQW9CLE1BQU0sTUFBTSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSw0QkFBNEIsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xKLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUsxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFOUUsT0FBTyxFQUNMLGdCQUFnQixFQUFjLFlBQVksRUFBRSx1Q0FBdUMsRUFBRSxzQ0FBc0MsRUFDM0gsMEJBQTBCLEVBQUUsbUNBQW1DLEVBQUUsa0NBQWtDLEVBQ25HLGdCQUFnQixFQUFFLG1DQUFtQyxFQUE4QixVQUFVLEVBQUUsa0NBQWtDLEVBQ3BILDBCQUEwQixF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LENBQUM7Z0JBQzdDLE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRU0sY0FBYyxDQUFDLFdBQStCO1FBQ25ELFFBQVEsV0FBVyxFQUFFLENBQUM7WUFDcEIsS0FBSyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7WUFDakMsS0FBSyxrQkFBa0IsQ0FBQyxhQUFhO2dCQUNuQyxPQUFPLElBQUksQ0FBQztZQUNkO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDOytHQWhrQm1CLGlCQUFpQjttSEFBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUR0QyxVQUFVO3NOQUdDLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGUsIG9mLCBPcGVyYXRvckZ1bmN0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tbWFuZE5vdGlmaWNhdGlvbkNvbmZpZywgQ29tbWFuZE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9jb21tYW5kLW5vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25DbGFzcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi1jb25maWcnO1xuaW1wb3J0IHsgZGV2aWNlSW5kaWNhdGlvblN0YXR1c0xvY2FsaXphdGlvbiwgcmVtb3RlQ29tbWFuZExvY2FsaXphdGlvbk1hcCwgU1VQUE9SVEVEX1NUQVRVU19ERVZJQ0VfVFlQRVMgfSBmcm9tICcuLi9jb25zdGFudHMvZGV2aWNlLXR5cGVzLm1vZGFsJztcbmltcG9ydCB7IENvbUFnZ3JlZ2F0ZWRTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9hZ2dyZWdhdGVkLXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IERldmljZUFjdGl2aXR5TGFiZWwsIERldmljZUFjdGl2aXR5U3RhdHVzIH0gZnJvbSAnLi4vZW51bXMvZGV2aWNlLWFjdGl2aXR5LXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IERldmljZUluZGljYXRpb25TdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9kZXZpY2UtaW5kaWNhdGlvbi1zdGF0dXMuZW51bSc7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb24gfSBmcm9tICcuLi9lbnVtcy9sb2NhbGl6YXRpb24uZW51bSc7XG5pbXBvcnQgeyBUcmFjZVBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2FuYWx5dGljcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ21kRGF0YUR0byB9IGZyb20gJy4uL2ludGVyZmFjZXMvY21kLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbmZpZ0RhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMb3N0VGlja2V0RGlhbG9nRGF0YSwgTHByTWlzbWF0Y2hEaWFsb2dEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90aWNrZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZhY2lsaXR5U3RhdGUgfSBmcm9tICcuLi9tb2R1bGVzL2ZhY2lsaXR5L2ZhY2lsaXR5LnN0YXRlJztcbmltcG9ydCB7IFBhcmtNYW5hZ2VyU3RhdGUgfSBmcm9tICcuLi9tb2R1bGVzL3BhcmstbWFuYWdlci9wYXJrLW1hbmFnZXIuc3RhdGUnO1xuaW1wb3J0IHsgSGFuZGxpbmdCeVVzZXJEdG8sIExQUk1hdGNoQ2FzZUR0bywgUGVyaXBoZXJhbEVxdWlwbWVudEVycm9yIH0gZnJvbSAnLi4vc2VydmljZS1wcm94eS9jbG91ZC1zZXJ2aWNlLXByb3hpZXMnO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRlZFN0YXR1cywgQmFycmllckR0bywgQmFycmllclN0YXRlLCBDaGFuZ2VEZXZpY2VBY2Nlc3NNb2RlUmVtb3RlQ29tbWFuZERhdGEsIENsb3NlR2F0ZUNvbnRpbnVvdXNseVJlbW90ZUNvbW1hbmREYXRhLFxuICBDbG9zZUdhdGVSZW1vdGVDb21tYW5kRGF0YSwgQ2xvc2VQYXltZW50U2NyZWVuUmVtb3RlQ29tbWFuZERhdGEsIENsb3NlVGlja2V0Rm9ySVNGUmVtb3RlQ29tbWFuZERhdGEsIENvbW1hbmRSZXBseUh0dHBSZXNwb25zZURhdGEsXG4gIENvbW1Qcm90b2NvbFR5cGUsIERlbGl2ZXJCdW5kbGVCaWxsc1JlbW90ZUNvbW1hbmREYXRhLCBEZXZpY2VEdG8sIERldmljZVN0YXR1c0R0bywgRGV2aWNlVHlwZSwgRWplY3RKYW1tZWRUaWNrZXRSZW1vdGVDb21tYW5kRGF0YSxcbiAgRmFjaWxpdHlEdG8sIEhvbGRSZWxheVJlbW90ZUNvbW1hbmREYXRhLCBJbnNlcnRWaXJ0dWFsVGlja2V0UmVtb3RlQ29tbWFuZERhdGEsIExvY2tDYXNoUmVnaXN0ZXJSZW1vdGVDb21tYW5kRGF0YSxcbiAgT3BlbkdhdGVDb250aW51b3VzbHlSZW1vdGVDb21tYW5kRGF0YSwgT3BlblJlbGF5UmVtb3RlQ29tbWFuZERhdGEsIFByaW50VGlja2V0UmVtb3RlQ29tbWFuZERhdGEsIFJlbW90ZUNvbW1hbmRCYXNlLFxuICBSZW1vdGVDb21tYW5kRGV2aWNlUGF5bG9hZCwgUmVtb3RlQ29tbWFuZFR5cGVzLCBSZXNldEJpbGxEaXNwZW5zZXJSZW1vdGVDb21tYW5kRGF0YSwgUmVzZXREZXZpY2VBY2Nlc3NNb2RlUmVtb3RlQ29tbWFuZERhdGEsXG4gIFJlc3RhcnREZXZpY2VSZW1vdGVDb21tYW5kRGF0YSwgU2V0UHJpY2VSZW1vdGVDb21tYW5kRGF0YSwgU2V0UmF0ZVJlbW90ZUNvbW1hbmREYXRhLCBTd2FsbG93SmFtbWVkVGlja2V0UmVtb3RlQ29tbWFuZERhdGEsXG4gIFN3YWxsb3dVbml0U3RhdHVzLCBTd2FsbG93VW5pdFR5cGUsIFRyaWdnZXJMcHJSZW1vdGVDb21tYW5kRGF0YSwgVHlwZUNhc3QsIFVubG9ja0Rvb3JSZW1vdGVDb21tYW5kRGF0YSwgVmFsaWRhdGVSZW1vdGVDb21tYW5kRGF0YSxcbiAgVmVuZEdhdGVSZW1vdGVDb21tYW5kRGF0YVxufSBmcm9tICcuLi9zZXJ2aWNlLXByb3h5L3JwYy1zZXJ2aWNlLXByb3hpZXMnO1xuaW1wb3J0IHsgaXNEZXZpY2VEaXNwbGF5ZWRBY3RpdmUgfSBmcm9tICcuLi91dGlscy9hY3RpdmUtZGV2aWNlLXN0YXR1cy51dGlsJztcbmltcG9ydCB7IEFwcFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4vYXBwLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVtb3RlQ29tbWFuZFNlcnZpY2UgfSBmcm9tICcuL3JlbW90ZS1jb21tYW5kLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZURldmljZVNlcnZpY2Uge1xuXG4gIEBPdXRwdXQoKSBsb2FkaW5nQ29tbWFuZCQ6IEV2ZW50RW1pdHRlcjx7IGNvbW1hbmRUeXBlOiBudW1iZXIsIGlzTG9hZGluZzogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb21tYW5kVHlwZTogbnVtYmVyLCBpc0xvYWRpbmc6IGJvb2xlYW4gfT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RvcmU6IFN0b3JlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIHJlbW90ZUNvbW1hbmRTZXJ2aWNlOiBSZW1vdGVDb21tYW5kU2VydmljZSxcbiAgICBwdWJsaWMgYXBwU2V0dGluZ3NTZXJ2aWNlOiBBcHBTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHVibGljIGNvbW1hbmROb3RpZmljYXRpb25TZXJ2aWNlOiBDb21tYW5kTm90aWZpY2F0aW9uU2VydmljZSkge1xuICB9XG5cbiAgcHVibGljIHNlbmRDb21tYW5kKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMsIGRldmljZUlkOiBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHt9LCBhbmFseXRpY3NQYXlsb2FkOiBUcmFjZVBheWxvYWQgPSB7fSk6IE9ic2VydmFibGU8eyBwYXlsb2FkRGF0YTogUmVtb3RlQ29tbWFuZEJhc2UsIHJlc3BvbnNlOiBDb21tYW5kUmVwbHlIdHRwUmVzcG9uc2VEYXRhIH0+IHtcbiAgICBjb25zdCBndWlkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgIGNvbnN0IGRldmljZTogRGV2aWNlRHRvID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChQYXJrTWFuYWdlclN0YXRlLmJ5SWQpW2RldmljZUlkXTtcbiAgICBvcHRpb25zLmRldmljZVN0YXR1cyA9IGRldmljZS5kZXZpY2VTdGF0dXM7XG4gICAgY29uc3QgY21kRGF0YUR0byQgPSB0aGlzLmdldERldmljZVJlbW90ZUNvbW1hbmREYXRhKGNvbW1hbmRUeXBlLCBvcHRpb25zKVxuICAgICAgLnBpcGUodGhpcy5wcm9jY2VzRGV2aWNlUGF5bG9hZERhdGEoZGV2aWNlSWQpKTtcblxuICAgIGNvbnN0IGRldmljZVBheUxvYWQgPSBuZXcgUmVtb3RlQ29tbWFuZERldmljZVBheWxvYWQoKTtcbiAgICBkZXZpY2VQYXlMb2FkLm5hbWUgPSBkZXZpY2U/Lm5hbWU7XG4gICAgZGV2aWNlUGF5TG9hZC5pZCA9IGRldmljZUlkO1xuXG4gICAgcmV0dXJuIHRoaXMucmVtb3RlQ29tbWFuZFNlcnZpY2Uuc2VuZChjbWREYXRhRHRvJCwgZ3VpZCwgZGV2aWNlUGF5TG9hZCwgYW5hbHl0aWNzUGF5bG9hZCkucGlwZSh0aGlzLnN0b3BMb2FkaW5nQ29tbWFuZChjb21tYW5kVHlwZSkpO1xuICB9XG5cbiAgcHVibGljIHNlbmRDb21tYW5kV2l0aFNuYWNrRGF0YShjb21tYW5kVHlwZTogUmVtb3RlQ29tbWFuZFR5cGVzLCBkZXZpY2VJZDogbnVtYmVyLCBvcHRpb25zOiBhbnkgPSB7fSwgYW5hbHl0aWNzUGF5bG9hZDogVHJhY2VQYXlsb2FkID0ge30pOlxuICAgIE9ic2VydmFibGU8eyBwYXlsb2FkRGF0YTogUmVtb3RlQ29tbWFuZEJhc2UsIHJlc3BvbnNlOiBDb21tYW5kUmVwbHlIdHRwUmVzcG9uc2VEYXRhIH0+IHtcbiAgICBpZiAoUmVtb3RlQ29tbWFuZFR5cGVzW2NvbW1hbmRUeXBlXSkge1xuICAgICAgY29uc3QgZ3VpZDogc3RyaW5nID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgICAgY29uc3QgZGV2aWNlOiBEZXZpY2VEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KFBhcmtNYW5hZ2VyU3RhdGUuYnlJZClbZGV2aWNlSWRdO1xuICAgICAgY29uc3QgcGFyazogRmFjaWxpdHlEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KEZhY2lsaXR5U3RhdGUuZmFjaWxpdHlEaWN0aW9uYXJ5KVtndWlkXVtkZXZpY2UucGFya0lEXTtcbiAgICAgIGNvbnN0IHRpY2tldElkZW50aWZpZXIgPSBvcHRpb25zPy50aWNrZXRJZGVudGlmaWVyO1xuICAgICAgY29uc3QgZW50aXR5RGlzcGxheU5hbWUgPSB0aWNrZXRJZGVudGlmaWVyPy5lbnRpdHlEaXNwbGF5TmFtZTtcbiAgICAgIGNvbnN0IGVudGl0eVR5cGVUcmFuc2xhdGUgPSB0aWNrZXRJZGVudGlmaWVyPy5lbnRpdHlUeXBlVHJhbnNsYXRlO1xuXG4gICAgICBjb25zdCBjb25maWc6IENvbW1hbmROb3RpZmljYXRpb25Db25maWcgPSB7XG4gICAgICAgIG1lc3NhZ2VzOiBbe1xuICAgICAgICAgIHZhbHVlOiBgJHtlbnRpdHlUeXBlVHJhbnNsYXRlfSAke2VudGl0eURpc3BsYXlOYW1lfWAsXG4gICAgICAgICAgY2xhc3M6IGVudGl0eURpc3BsYXlOYW1lID8gTm90aWZpY2F0aW9uQ2xhc3Muc3ViVGl0bGUgOiBOb3RpZmljYXRpb25DbGFzcy5ub25lLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IGAke2RldmljZT8ubmFtZX0gfCAjJHtkZXZpY2U/LmNvbW1JRH1gLFxuICAgICAgICAgIGNsYXNzOiBkZXZpY2U/Lm5hbWUgJiYgZGV2aWNlPy5jb21tSUQgPyBOb3RpZmljYXRpb25DbGFzcy5zdWJUaXRsZSA6IE5vdGlmaWNhdGlvbkNsYXNzLm5vbmUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogYCR7cGFyaz8ubmFtZX1gLFxuICAgICAgICAgIGNsYXNzOiBwYXJrID8gTm90aWZpY2F0aW9uQ2xhc3MuYm9keSA6IE5vdGlmaWNhdGlvbkNsYXNzLm5vbmUsXG4gICAgICAgIH1dLFxuICAgICAgICBjb21tYW5kOiB0aGlzLnJlbW90ZUNvbW1hbmRTZXJ2aWNlLmdldFJlbW90ZUNvbW1hbmRUZXh0KGNvbW1hbmRUeXBlLCBvcHRpb25zKSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnNlbmRDb21tYW5kKGNvbW1hbmRUeXBlLCBkZXZpY2VJZCwgb3B0aW9ucywgYW5hbHl0aWNzUGF5bG9hZClcbiAgICAgICAgLnBpcGUodGhpcy5jb21tYW5kTm90aWZpY2F0aW9uU2VydmljZS5kaXNwbGF5KGNvbmZpZykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkxvc3RUaWNrZXQoZ3VpZDogc3RyaW5nLCBwYXJrSWQ6IG51bWJlciwgcGFya05hbWU6IHN0cmluZywgcmVhZGVySWQ6IG51bWJlciwgZGV2aWNlTmFtZTogc3RyaW5nLCBkZXZpY2VJZDogbnVtYmVyLCBoYW5kbGluZ0J5VXNlcjogSGFuZGxpbmdCeVVzZXJEdG8sIGV2ZW50RGVzY3JpcHRpb246IFBlcmlwaGVyYWxFcXVpcG1lbnRFcnJvciwgYW5hbHl0aWNzUGF5bG9hZDogVHJhY2VQYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBjb25maWc6IENvbW1hbmROb3RpZmljYXRpb25Db25maWcgPSB7XG4gICAgICBtZXNzYWdlczogW3tcbiAgICAgICAgdmFsdWU6IGAke2RldmljZU5hbWV9IHwgIyR7cmVhZGVySWR9YCxcbiAgICAgICAgY2xhc3M6IE5vdGlmaWNhdGlvbkNsYXNzLnN1YlRpdGxlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGAke3BhcmtOYW1lfWAsXG4gICAgICAgIGNsYXNzOiBOb3RpZmljYXRpb25DbGFzcy5ib2R5LFxuICAgICAgfV0sXG4gICAgICBjb21tYW5kOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5sb3N0X3RpY2tldClcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9zdFRpY2tldE1vZGFsQ29tbWFuZChndWlkLCBwYXJrSWQsIHBhcmtOYW1lLCByZWFkZXJJZCwgZGV2aWNlTmFtZSwgZGV2aWNlSWQsIGhhbmRsaW5nQnlVc2VyLCBldmVudERlc2NyaXB0aW9uKS5waXBlKHN3aXRjaE1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgaWYgKCFtb2RhbERhdGEpIHtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbWREYXRhRHRvOiBDbWREYXRhRHRvID0ge1xuICAgICAgICBjbWRUeXBlOiBtb2RhbERhdGEuY29tbWFuZFR5cGVPdmVycmlkZSxcbiAgICAgICAgY21kRHRvOiBuZXcgUmVtb3RlQ29tbWFuZEJhc2UoKVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc3ViT3BlcmF0aW9uID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmhhbmRsZUNvbW1hbmRUeXBlT3ZlcnJpZGVOYW1lKG1vZGFsRGF0YS5jb21tYW5kVHlwZU92ZXJyaWRlKSk7XG4gICAgICBjb25maWcuY29tbWFuZCA9IGAke3N1Yk9wZXJhdGlvbn0gKCR7Y29uZmlnLmNvbW1hbmR9KWA7XG5cbiAgICAgIGNvbnN0IGRldmljZVBheUxvYWQgPSBuZXcgUmVtb3RlQ29tbWFuZERldmljZVBheWxvYWQoKTtcbiAgICAgIGRldmljZVBheUxvYWQubmFtZSA9IGRldmljZU5hbWU7XG4gICAgICBkZXZpY2VQYXlMb2FkLmlkID0gZGV2aWNlSWQ7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlbW90ZUNvbW1hbmRTZXJ2aWNlXG4gICAgICAgIC5zZW5kKG9mKHRoaXMuaGFuZGxlVGlja2V0Q29tbWFuZChjbWREYXRhRHRvLCBtb2RhbERhdGEpKS5waXBlKHRoaXMucHJvY2Nlc0RldmljZVBheWxvYWREYXRhKGRldmljZUlkLCBwYXJrSWQpKSwgZ3VpZCwgZGV2aWNlUGF5TG9hZCwgYW5hbHl0aWNzUGF5bG9hZClcbiAgICAgICAgLnBpcGUodGhpcy5jb21tYW5kTm90aWZpY2F0aW9uU2VydmljZS5kaXNwbGF5KGNvbmZpZykpLnBpcGUodGhpcy5zdG9wTG9hZGluZ0NvbW1hbmQoY21kRGF0YUR0by5jbWRUeXBlKSk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIG9uTHByTWlzbWF0Y2goZ3VpZDogc3RyaW5nLCBwYXJrSWQ6IG51bWJlciwgcGFya05hbWU6IHN0cmluZywgcmVhZGVySWQ6IG51bWJlciwgZGV2aWNlTmFtZTogc3RyaW5nLCBkZXZpY2VJZDogbnVtYmVyLCBscHJNYXRjaENhc2U6IExQUk1hdGNoQ2FzZUR0bywgaGFuZGxpbmdCeVVzZXI6IEhhbmRsaW5nQnlVc2VyRHRvLCBldmVudERlc2NyaXB0aW9uOiBQZXJpcGhlcmFsRXF1aXBtZW50RXJyb3IsIGFuYWx5dGljc1BheWxvYWQ6IFRyYWNlUGF5bG9hZCA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnOiBDb21tYW5kTm90aWZpY2F0aW9uQ29uZmlnID0ge1xuICAgICAgbWVzc2FnZXM6IFt7XG4gICAgICAgIHZhbHVlOiBgJHtkZXZpY2VOYW1lfSB8ICMke3JlYWRlcklkfWAsXG4gICAgICAgIGNsYXNzOiBOb3RpZmljYXRpb25DbGFzcy5zdWJUaXRsZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBgJHtwYXJrTmFtZX1gLFxuICAgICAgICBjbGFzczogTm90aWZpY2F0aW9uQ2xhc3MuYm9keSxcbiAgICAgIH1dLFxuICAgICAgY29tbWFuZDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24ubHByX21pc21hdGNoKVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5nZXRMcHJNaXNtYXRjaE1vZGFsQ29tbWFuZChndWlkLCBwYXJrSWQsIHBhcmtOYW1lLCByZWFkZXJJZCwgZGV2aWNlTmFtZSwgbHByTWF0Y2hDYXNlLCBoYW5kbGluZ0J5VXNlciwgZXZlbnREZXNjcmlwdGlvbiwgZGV2aWNlSWQpLnBpcGUoc3dpdGNoTWFwKG1vZGFsRGF0YSA9PiB7XG4gICAgICBpZiAoIW1vZGFsRGF0YSkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbWREYXRhRHRvOiBDbWREYXRhRHRvID0ge1xuICAgICAgICBjbWRUeXBlOiBtb2RhbERhdGEuY29tbWFuZFR5cGVPdmVycmlkZSxcbiAgICAgICAgY21kRHRvOiBuZXcgUmVtb3RlQ29tbWFuZEJhc2UoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN1Yk9wZXJhdGlvbiA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5oYW5kbGVDb21tYW5kVHlwZU92ZXJyaWRlTmFtZShtb2RhbERhdGEuY29tbWFuZFR5cGVPdmVycmlkZSkpO1xuICAgICAgY29uZmlnLmNvbW1hbmQgPSBgJHtzdWJPcGVyYXRpb259ICgke2NvbmZpZy5jb21tYW5kfSlgO1xuXG4gICAgICBjb25zdCBkZXZpY2VQYXlMb2FkID0gbmV3IFJlbW90ZUNvbW1hbmREZXZpY2VQYXlsb2FkKCk7XG4gICAgICBkZXZpY2VQYXlMb2FkLm5hbWUgPSBkZXZpY2VOYW1lO1xuICAgICAgZGV2aWNlUGF5TG9hZC5pZCA9IGRldmljZUlkO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZW1vdGVDb21tYW5kU2VydmljZVxuICAgICAgICAuc2VuZChvZih0aGlzLmhhbmRsZVRpY2tldENvbW1hbmQoY21kRGF0YUR0bywgbW9kYWxEYXRhKSkucGlwZSh0aGlzLnByb2NjZXNEZXZpY2VQYXlsb2FkRGF0YShkZXZpY2VJZCwgcGFya0lkKSksIGd1aWQsIGRldmljZVBheUxvYWQsIGFuYWx5dGljc1BheWxvYWQpXG4gICAgICAgIC5waXBlKHRoaXMuY29tbWFuZE5vdGlmaWNhdGlvblNlcnZpY2UuZGlzcGxheShjb25maWcpKS5waXBlKHRoaXMuc3RvcExvYWRpbmdDb21tYW5kKGNtZERhdGFEdG8uY21kVHlwZSkpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9wTG9hZGluZ0NvbW1hbmQ8VD4oY29tbWFuZFR5cGU6IFJlbW90ZUNvbW1hbmRUeXBlcyk6IE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxUPiB7XG4gICAgcmV0dXJuICRpbnB1dCA9PiAkaW5wdXQucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdDb21tYW5kJC5uZXh0KHsgY29tbWFuZFR5cGUsIGlzTG9hZGluZzogZmFsc2UgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nQ29tbWFuZCQubmV4dCh7IGNvbW1hbmRUeXBlLCBpc0xvYWRpbmc6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0TW9kYWxDb21tYW5kKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMsIGRhdGE6IENvbmZpZ0RhdGEpOiBPYnNlcnZhYmxlPGFueT47XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRMb3N0VGlja2V0TW9kYWxDb21tYW5kKGd1aWQ6IHN0cmluZywgcGFya0lkOiBudW1iZXIsIHBhcmtOYW1lOiBzdHJpbmcsIHJlYWRlcklkOiBudW1iZXIsIGRldmljZU5hbWU6IHN0cmluZywgZGV2aWNlSWQ6IG51bWJlciwgaGFuZGxpbmdCeVVzZXI6IEhhbmRsaW5nQnlVc2VyRHRvLCBldmVudERlc2NyaXB0aW9uOiBQZXJpcGhlcmFsRXF1aXBtZW50RXJyb3IpOiBPYnNlcnZhYmxlPExvc3RUaWNrZXREaWFsb2dEYXRhPjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldExwck1pc21hdGNoTW9kYWxDb21tYW5kKGd1aWQ6IHN0cmluZywgcGFya0lkOiBudW1iZXIsIHBhcmtOYW1lOiBzdHJpbmcsIHJlYWRlcklkOiBudW1iZXIsIGRldmljZU5hbWU6IHN0cmluZywgbHByTWF0Y2hDYXNlOiBMUFJNYXRjaENhc2VEdG8sIGhhbmRsaW5nQnlVc2VyOiBIYW5kbGluZ0J5VXNlckR0bywgZXZlbnREZXNjcmlwdGlvbjogUGVyaXBoZXJhbEVxdWlwbWVudEVycm9yLCBkZXZpY2VJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxMcHJNaXNtYXRjaERpYWxvZ0RhdGE+O1xuXG4gIHByb3RlY3RlZCBnZXREZXZpY2VSZW1vdGVDb21tYW5kRGF0YShjb21tYW5kVHlwZTogUmVtb3RlQ29tbWFuZFR5cGVzLCBvcHRpb25zOiBhbnkgPSB7fSk6IE9ic2VydmFibGU8Q21kRGF0YUR0bz4ge1xuICAgIGNvbnN0IGNtZERhdGFEdG86IENtZERhdGFEdG8gPSB7XG4gICAgICBjbWRUeXBlOiBjb21tYW5kVHlwZSxcbiAgICAgIGNtZER0bzogbmV3IFJlbW90ZUNvbW1hbmRCYXNlKCksXG4gICAgfTtcbiAgICBjb25zdCBkYXRhOiBDb25maWdEYXRhID0geyBjb21tYW5kVHlwZSwgdGlja2V0SWRlbnRpZmllcjogb3B0aW9ucz8udGlja2V0SWRlbnRpZmllciwgb3B0aW9ucyB9O1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5nZXRNb2RhbENvbW1hbmQoY29tbWFuZFR5cGUsIGRhdGEpO1xuICAgIHN3aXRjaCAoY29tbWFuZFR5cGUpIHtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlZlbmRHYXRlOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShcbiAgICAgICAgICBtYXAobW9kYWxEYXRhID0+IHtcbiAgICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2ZW5kR2F0ZUNvbW1hbmQgPSBuZXcgVmVuZEdhdGVSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgICAgdmVuZEdhdGVDb21tYW5kLnRpY2tldElkID0gb3B0aW9ucy50aWNrZXRJZGVudGlmaWVyPy50aWNrZXRJZDtcbiAgICAgICAgICAgIHZlbmRHYXRlQ29tbWFuZC50cmFuc3BvcnRSZWFzb24gPSBtb2RhbERhdGEucmVhc29uO1xuICAgICAgICAgICAgdmVuZEdhdGVDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgdmVuZEdhdGVDb21tYW5kLnR5cGVPZlBhcmtlciA9IG1vZGFsRGF0YS50eXBlIHx8IG9wdGlvbnMudHlwZSB8fCBUeXBlQ2FzdC5JZ25vcmVkO1xuICAgICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSB2ZW5kR2F0ZUNvbW1hbmQ7XG5cbiAgICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNsb3NlR2F0ZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbG9zZUdhdGVDb21tYW5kID0gbmV3IENsb3NlR2F0ZVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBjbG9zZUdhdGVDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlNldFByaWNlOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAobW9kYWxEYXRhID0+IHtcbiAgICAgICAgICBpZiAoIW1vZGFsRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2V0UHJpY2VDb21tYW5kID0gbmV3IFNldFByaWNlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBzZXRQcmljZUNvbW1hbmQudGlja2V0SWQgPSBvcHRpb25zLnRpY2tldElkZW50aWZpZXI/LnRpY2tldElkO1xuICAgICAgICAgIHNldFByaWNlQ29tbWFuZC5wcmljZSA9IG1vZGFsRGF0YS5wcmljZTtcbiAgICAgICAgICBzZXRQcmljZUNvbW1hbmQudHJhbnNwb3J0UmVhc29uID0gbW9kYWxEYXRhLnJlYXNvbjtcbiAgICAgICAgICBzZXRQcmljZUNvbW1hbmQuZGVzY3JpcHRpb24gPSBtb2RhbERhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBzZXRQcmljZUNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuU2V0UmF0ZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKG1vZGFsRGF0YSA9PiB7XG4gICAgICAgICAgaWYgKCFtb2RhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNldFJhdGVDb21tYW5kID0gbmV3IFNldFJhdGVSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIHNldFJhdGVDb21tYW5kLnRpY2tldElkID0gb3B0aW9ucy50aWNrZXRJZGVudGlmaWVyPy50aWNrZXRJZDtcbiAgICAgICAgICBzZXRSYXRlQ29tbWFuZC5yYXRlSWQgPSBtb2RhbERhdGEucmF0ZUlkO1xuICAgICAgICAgIHNldFJhdGVDb21tYW5kLnRyYW5zcG9ydFJlYXNvbiA9IG1vZGFsRGF0YS5yZWFzb247XG4gICAgICAgICAgc2V0UmF0ZUNvbW1hbmQuZGVzY3JpcHRpb24gPSBtb2RhbERhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBzZXRSYXRlQ29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5WYWxpZGF0ZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKG1vZGFsRGF0YSA9PiB7XG4gICAgICAgICAgaWYgKCFtb2RhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRlQ29tbWFuZCA9IG5ldyBWYWxpZGF0ZVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLnRpY2tldElkID0gb3B0aW9ucy50aWNrZXRJZGVudGlmaWVyPy50aWNrZXRJZDtcbiAgICAgICAgICB2YWxpZGF0ZUNvbW1hbmQucHJpY2UgPSBtb2RhbERhdGEucHJpY2U7XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLnByaW50Tm90ZSA9IG1vZGFsRGF0YS5wcmludE5vdGU7XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLnRyYW5zcG9ydFJlYXNvbiA9IG1vZGFsRGF0YS5yZWFzb247XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gdmFsaWRhdGVDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlJlc3RvcmVUaWNrZXQ6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVUaWNrZXRDb21tYW5kKGNtZERhdGFEdG8sIG1vZGFsRGF0YSk7XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNoYW5nZURldmljZUFjY2Vzc01vZGU6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlRGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQgPSBuZXcgQ2hhbmdlRGV2aWNlQWNjZXNzTW9kZVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY2hhbmdlRGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQuZGV2aWNlQWNjZXNzTW9kZSA9IG9wdGlvbnMucmVtb3RlQ21kTmFtZTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IGNoYW5nZURldmljZUFjY2Vzc01vZGVDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkhvbGRSZWxheTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBob2xkUmVsYXlDb21tYW5kID0gbmV3IEhvbGRSZWxheVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgaG9sZFJlbGF5Q29tbWFuZC5yZWxheUluZGV4ID0gb3B0aW9ucy5yZWxheUluZGV4O1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gaG9sZFJlbGF5Q29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5PcGVuUmVsYXk6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3BlblJlbGF5Q29tbWFuZCA9IG5ldyBPcGVuUmVsYXlSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIG9wZW5SZWxheUNvbW1hbmQucmVsYXlJbmRleCA9IG9wdGlvbnMucmVsYXlJbmRleDtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IG9wZW5SZWxheUNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuUmVzZXREZXZpY2VBY2Nlc3NNb2RlOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc2V0RGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQgPSBuZXcgUmVzZXREZXZpY2VBY2Nlc3NNb2RlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHJlc2V0RGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuUmVzZXRCaWxsRGlzcGVuc2VyOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc2V0QmlsbERpc3BlbnNlckNvbW1hbmQgPSBuZXcgUmVzZXRCaWxsRGlzcGVuc2VyUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHJlc2V0QmlsbERpc3BlbnNlckNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuVHJpZ2dlckxQUk1vZHVsZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB0cmlnZ2VyTHByQ29tbWFuZCA9IG5ldyBUcmlnZ2VyTHByUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHRyaWdnZXJMcHJDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkVqZWN0SmFtbWVkVGlja2V0OlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVqZWN0SmFtbWVkVGlja2V0Q29tbWFuZCA9IG5ldyBFamVjdEphbW1lZFRpY2tldFJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBlamVjdEphbW1lZFRpY2tldENvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuU3dhbGxvd0phbW1lZFRpY2tldDpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzd2FsbG93SmFtbWVkVGlja2V0Q29tbWFuZCA9IG5ldyBTd2FsbG93SmFtbWVkVGlja2V0UmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHN3YWxsb3dKYW1tZWRUaWNrZXRDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkRlbGl2ZXJCdW5kbGVCaWxsczpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWxpdmVyQnVuZGxlQmlsbHNDb21tYW5kID0gbmV3IERlbGl2ZXJCdW5kbGVCaWxsc1JlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBkZWxpdmVyQnVuZGxlQmlsbHNDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkxvY2tDYXNoUmVnaXN0ZXI6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9ja0Nhc2hSZWdpc3RlckNvbW1hbmQgPSBuZXcgTG9ja0Nhc2hSZWdpc3RlclJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBsb2NrQ2FzaFJlZ2lzdGVyQ29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5PcGVuR2F0ZUNvbnRpbnVvdXNseTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBvcGVuR2F0ZUNvbnRpbnVvdXNseUNvbW1hbmQgPSBuZXcgT3BlbkdhdGVDb250aW51b3VzbHlSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gb3BlbkdhdGVDb250aW51b3VzbHlDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNsb3NlR2F0ZUNvbnRpbnVvdXNseTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbG9zZUdhdGVDb250aW51b3VzbHlDb21tYW5kID0gbmV3IENsb3NlR2F0ZUNvbnRpbnVvdXNseVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBjbG9zZUdhdGVDb250aW51b3VzbHlDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlJlc3RhcnREZXZpY2U6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXN0YXJ0RGV2aWNlQ29tbWFuZCA9IG5ldyBSZXN0YXJ0RGV2aWNlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHJlc3RhcnREZXZpY2VDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlVubG9ja0Rvb3I6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB1bmxvY2tEb29yQ29tbWFuZCA9IG5ldyBVbmxvY2tEb29yUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICB1bmxvY2tEb29yQ29tbWFuZC5wYXNzd29yZCA9IG1vZGFsRGF0YS5wYXNzd29yZDtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHVubG9ja0Rvb3JDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNsb3NlVGlja2V0Rm9ySVNGOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAobW9kYWxEYXRhID0+IHtcbiAgICAgICAgICBpZiAoIW1vZGFsRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY2xvc2VUaWNrZXRGb3JJU0ZDb21tYW5kID0gbmV3IENsb3NlVGlja2V0Rm9ySVNGUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQuZHJpdmVyTGljZW5zZSA9IG1vZGFsRGF0YS5kcml2ZXJMaWNlbnNlO1xuICAgICAgICAgIGNsb3NlVGlja2V0Rm9ySVNGQ29tbWFuZC5maXJzdE5hbWUgPSBtb2RhbERhdGEuZmlyc3ROYW1lO1xuICAgICAgICAgIGNsb3NlVGlja2V0Rm9ySVNGQ29tbWFuZC5sYXN0TmFtZSA9IG1vZGFsRGF0YS5sYXN0TmFtZTtcbiAgICAgICAgICBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQuYWRkcmVzcyA9IG1vZGFsRGF0YS5hZGRyZXNzO1xuICAgICAgICAgIGNsb3NlVGlja2V0Rm9ySVNGQ29tbWFuZC5lbWFpbCA9IG1vZGFsRGF0YS5lbWFpbDtcbiAgICAgICAgICBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQucGhvbmUgPSBtb2RhbERhdGEucGhvbmU7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuXG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5DbG9zZVBheW1lbnRTY3JlZW46XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2xvc2VQYXltZW50U2NyZWVuQ29tbWFuZCA9IG5ldyBDbG9zZVBheW1lbnRTY3JlZW5SZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gY2xvc2VQYXltZW50U2NyZWVuQ29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Nlc0RldmljZVBheWxvYWREYXRhKGRldmljZUlkOiBudW1iZXIsIHBhcmtJZD86IG51bWJlcik6IE9wZXJhdG9yRnVuY3Rpb248Q21kRGF0YUR0bywgQ21kRGF0YUR0bz4ge1xuICAgIHJldHVybiAkaW5wdXQgPT4gJGlucHV0LnBpcGUoXG4gICAgICBtYXAoKGNtZERhdGFEdG86IENtZERhdGFEdG8pID0+IHtcbiAgICAgICAgaWYgKGNtZERhdGFEdG8pIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdDb21tYW5kJC5uZXh0KHsgY29tbWFuZFR5cGU6IGNtZERhdGFEdG8uY21kVHlwZSwgaXNMb2FkaW5nOiB0cnVlIH0pO1xuXG4gICAgICAgICAgLy8gSGFuZGxlIFBhcmtJZFxuICAgICAgICAgIGlmIChwYXJrSWQpIHtcbiAgICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvLnBhcmtJZCA9IHBhcmtJZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZ3VpZDogc3RyaW5nID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgICAgICAgICAgY29uc3QgZGV2aWNlOiBEZXZpY2VEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KFBhcmtNYW5hZ2VyU3RhdGUuYnlJZClbZGV2aWNlSWRdO1xuICAgICAgICAgICAgY29uc3QgcGFyazogRmFjaWxpdHlEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KEZhY2lsaXR5U3RhdGUuZmFjaWxpdHlEaWN0aW9uYXJ5KVtndWlkXVtkZXZpY2UucGFya0lEXTtcbiAgICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvLnBhcmtJZCA9IHBhcmsuaWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGFuZGxlIFJlYWRlcklkXG4gICAgICAgICAgaWYgKCFjbWREYXRhRHRvLmNtZER0by5yZWFkZXJJZCkge1xuICAgICAgICAgICAgY29uc3QgZGV2aWNlOiBEZXZpY2VEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KFBhcmtNYW5hZ2VyU3RhdGUuYnlJZClbZGV2aWNlSWRdO1xuICAgICAgICAgICAgY21kRGF0YUR0by5jbWREdG8ucmVhZGVySWQgPSBkZXZpY2U/LmNvbW1JRDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICB9XG4gICAgICApKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVUaWNrZXRDb21tYW5kKGNtZERhdGFEdG86IENtZERhdGFEdG8sIG1vZGFsRGF0YTogYW55KTogQ21kRGF0YUR0byB7XG4gICAgY21kRGF0YUR0by5jbWRUeXBlID0gbW9kYWxEYXRhLmNvbW1hbmRUeXBlT3ZlcnJpZGUgfHwgY21kRGF0YUR0by5jbWRUeXBlO1xuICAgIHN3aXRjaCAoY21kRGF0YUR0by5jbWRUeXBlKSB7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5TZXRQcmljZTpcbiAgICAgICAgY29uc3Qgc2V0UHJpY2VDb21tYW5kID0gbmV3IFNldFByaWNlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgc2V0UHJpY2VDb21tYW5kLnByaWNlID0gbW9kYWxEYXRhLnByaWNlO1xuICAgICAgICBzZXRQcmljZUNvbW1hbmQudHJhbnNwb3J0UmVhc29uID0gbW9kYWxEYXRhLnJlYXNvbjtcbiAgICAgICAgc2V0UHJpY2VDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICBzZXRQcmljZUNvbW1hbmQucmVhZGVySWQgPSBtb2RhbERhdGEucmVhZGVySWRPdmVycmlkZTtcbiAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBzZXRQcmljZUNvbW1hbmQ7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5QcmludFRpY2tldDpcbiAgICAgICAgY29uc3QgcHJpbnRUaWNrZXRDb21tYW5kID0gbmV3IFByaW50VGlja2V0UmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgcHJpbnRUaWNrZXRDb21tYW5kLnRpY2tldElkID0gbW9kYWxEYXRhLnRpY2tldElkO1xuICAgICAgICBwcmludFRpY2tldENvbW1hbmQudHJhbnNwb3J0UmVhc29uID0gbW9kYWxEYXRhLnJlYXNvbjtcbiAgICAgICAgcHJpbnRUaWNrZXRDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICBwcmludFRpY2tldENvbW1hbmQucmVhZGVySWQgPSBtb2RhbERhdGEucmVhZGVySWRPdmVycmlkZTtcbiAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBwcmludFRpY2tldENvbW1hbmQ7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5JbnNlcnRWaXJ0dWFsVGlja2V0OlxuICAgICAgICBjb25zdCBpbnNlcnRWaXJ0dWFsVGlja2V0Q29tbWFuZCA9IG5ldyBJbnNlcnRWaXJ0dWFsVGlja2V0UmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgaW5zZXJ0VmlydHVhbFRpY2tldENvbW1hbmQudGlja2V0SWQgPSBtb2RhbERhdGEudGlja2V0SWQ7XG4gICAgICAgIGluc2VydFZpcnR1YWxUaWNrZXRDb21tYW5kLnRyYW5zcG9ydFJlYXNvbiA9IG1vZGFsRGF0YS5yZWFzb247XG4gICAgICAgIGluc2VydFZpcnR1YWxUaWNrZXRDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICBpbnNlcnRWaXJ0dWFsVGlja2V0Q29tbWFuZC5yZWFkZXJJZCA9IG1vZGFsRGF0YS5yZWFkZXJJZE92ZXJyaWRlO1xuICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IGluc2VydFZpcnR1YWxUaWNrZXRDb21tYW5kO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtZERhdGFEdG87XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbW1hbmRUeXBlT3ZlcnJpZGVOYW1lKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMpOiBzdHJpbmcge1xuICAgIHJldHVybiAocmVtb3RlQ29tbWFuZExvY2FsaXphdGlvbk1hcC5oYXMoY29tbWFuZFR5cGUpKSA/IHJlbW90ZUNvbW1hbmRMb2NhbGl6YXRpb25NYXAuZ2V0KGNvbW1hbmRUeXBlKSA6IExvY2FsaXphdGlvbi51bmtub3duO1xuICB9XG5cbiAgcHVibGljIGdldERldmljZUNvbW11bmljYXRpb25QZXJjZW50YWdlVGV4dChkZXZpY2U6IERldmljZUR0bykge1xuICAgIGxldCB2YWx1ZSA9ICctJztcbiAgICBpZiAoZGV2aWNlLmNvbW1JRCA+IDApIHtcbiAgICAgIC8vIFNQUkszLTE0NjA4OiBhIHZpcnR1YWwgZGV2aWNlIHJlcG9ydHMgaXRzIHJlYWwgY29tbXVuaWNhdGlvbiB2YWx1ZSwgbm90IHRoZSBJbmFjdGl2ZSBsYWJlbFxuICAgICAgaWYgKCFpc0RldmljZURpc3BsYXllZEFjdGl2ZShkZXZpY2UpKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChEZXZpY2VBY3Rpdml0eUxhYmVsLmdldChEZXZpY2VBY3Rpdml0eVN0YXR1cy5JbmFjdGl2ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzU3RhdHVzU3VwcG9ydGVkKGRldmljZS50eXBlKSkge1xuICAgICAgICB2YWx1ZSA9IGAke2RldmljZS5kZXZpY2VTdGF0dXM/LmNvbW11bmljYXRpb25QZXJjZW50YWdlIHx8IDB9JWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlQ29tQWdncmVnYXRlZFN0YXR1cyhkZXZpY2VTdGF0dXNEYXRhOiBEZXZpY2VTdGF0dXNEdG8sIGlzQ29tU3RhdHVzID0gZmFsc2UpOiBDb21BZ2dyZWdhdGVkU3RhdHVzIHtcbiAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIGFuIE1DIChjb21taWQgPT09IDApIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBQYXJrIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiB0aGUgRGV2aWNlXG4gICAgbGV0IGNvbUFnZ3JlZ2F0ZWRTdGF0dXM6IENvbUFnZ3JlZ2F0ZWRTdGF0dXM7XG5cbiAgICBpZiAoZGV2aWNlU3RhdHVzRGF0YT8uY29tbUlEID09PSAwKSB7XG4gICAgICBjb25zdCBndWlkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgICAgY29uc3QgcGFya0lkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChQYXJrTWFuYWdlclN0YXRlLmJ5SWQpW2RldmljZVN0YXR1c0RhdGEuZGV2aWNlSURdLnBhcmtJRDtcbiAgICAgIGNvbnN0IGZhY2lsaXR5ID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmZhY2lsaXR5RGljdGlvbmFyeSlbZ3VpZF1bcGFya0lkXTtcbiAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBmYWNpbGl0eT8uaXNNYWluQ29udHJvbGxlckNvbm5lY3RlZCA/IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuT2sgOiBDb21BZ2dyZWdhdGVkU3RhdHVzLkNvbUVycm9yO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNhbGN1bGF0ZXMgdGhlIGNvbW11bmljYXRpb24gc3RhdHVzIG9mIHRoZSBkZXZpY2VcbiAgICAgIGlmICghZGV2aWNlU3RhdHVzRGF0YT8uaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgY29tQWdncmVnYXRlZFN0YXR1cyA9IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuQ29tRXJyb3I7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCZXR3ZWVuUmFuZ2UoZGV2aWNlU3RhdHVzRGF0YT8uY29tbXVuaWNhdGlvblBlcmNlbnRhZ2UudG9TdHJpbmcoKSwgMSwgNzApKSB7XG4gICAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBDb21BZ2dyZWdhdGVkU3RhdHVzLldhcm5pbmc7XG4gICAgICB9IGVsc2UgaWYgKGRldmljZVN0YXR1c0RhdGE/LmNvbW11bmljYXRpb25QZXJjZW50YWdlID49IDcxKSB7XG4gICAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBDb21BZ2dyZWdhdGVkU3RhdHVzLk9rO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGFsc28gY2FsY3VsYXRlcyB0aGUgZGV2aWNlcyBBZ2dyZWdhdGVkU3RhdHVzIGFuZCBjb21wYXJlcyB0byB0aGUgY29tbXVuaWNhdGlvbiBBZ2dyZWdhdGVkU3RhdHVzXG4gICAgICAvLyBIaWdoTGV2ZWwgbGVmdCBpbmRpY2F0b3IsIGxpc3QvZ2FsYXJ5IHZpZXdcbiAgICAgIGNvbnN0IGRldmljZUFnZ3JlZ2F0ZWRTdGF0dXMgPSB0aGlzLmNvbnZlcnRBZ2dyZWdhdGVkU3RhdHVzVG9Db21BZ2dyZWdhdGVkU3RhdHVzKGRldmljZVN0YXR1c0RhdGE/LmFnZ3JlZ2F0ZWRTdGF0dXMpO1xuICAgICAgaWYgKCFpc0NvbVN0YXR1cyAmJiBkZXZpY2VBZ2dyZWdhdGVkU3RhdHVzID4gY29tQWdncmVnYXRlZFN0YXR1cykge1xuICAgICAgICBjb21BZ2dyZWdhdGVkU3RhdHVzID0gZGV2aWNlQWdncmVnYXRlZFN0YXR1cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuZGV2aWNlU3RhdHVzTWFwcGluZy5Db21bQ29tQWdncmVnYXRlZFN0YXR1c1tjb21BZ2dyZWdhdGVkU3RhdHVzXV07XG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlQ29tQWdncmVnYXRlZFN0YXR1c0NsYXNzKGRldmljZTogRGV2aWNlRHRvKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGF0dXNDbGFzc2VzOiBzdHJpbmdbXSA9IFsnaGlnaC1sZXZlbCddO1xuXG4gICAgLy8gU1BSSzMtMTQ2MDg6IGEgdmlydHVhbCBkZXZpY2Uga2VlcHMgaXRzIHJlYWwgY29tbXVuaWNhdGlvbiBzdGF0dXMgY2xhc3MgaW5zdGVhZCBvZiB0aGVcbiAgICAvLyBpbmFjdGl2ZSBvbmUuIFRoZSBkZXZpY2UgZGV0YWlsIHBhZ2UgcGFzc2VzIHRoaXMgY2xhc3MgaW50byB0Yi12aXJ0dWFsLWRldmljZSwgd2hpY2hcbiAgICAvLyBhcHBsaWVzIGl0IHRvIHRoZSBwYW5lbCBoZWFkZXIgYm9yZGVyLlxuICAgIGlmICghaXNEZXZpY2VEaXNwbGF5ZWRBY3RpdmUoZGV2aWNlKSkge1xuICAgICAgc3RhdHVzQ2xhc3Nlcy5wdXNoKCdpbmFjdGl2ZScpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1N0YXR1c1N1cHBvcnRlZChkZXZpY2U/LnR5cGUpKSB7XG4gICAgICBjb25zdCBkZXZpY2VBZ2dyZWdhdGVkU3RhdHVzID0gdGhpcy5nZXREZXZpY2VDb21BZ2dyZWdhdGVkU3RhdHVzKGRldmljZS5kZXZpY2VTdGF0dXMpO1xuICAgICAgc3RhdHVzQ2xhc3Nlcy5wdXNoKENvbUFnZ3JlZ2F0ZWRTdGF0dXNbZGV2aWNlQWdncmVnYXRlZFN0YXR1c10udG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXR1c0NsYXNzZXMuam9pbihcIiBcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNCZXR3ZWVuUmFuZ2UoaW5wdXQ6IHN0cmluZywgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGlucHV0VmFsID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICByZXR1cm4gaW5wdXRWYWwgPj0gbWluVmFsdWUgJiYgaW5wdXRWYWwgPD0gbWF4VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlSW5kaWNhdGlvblN0YXR1c2VzKGRldmljZVN0YXR1czogRGV2aWNlU3RhdHVzRHRvKSB7XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ2FyT25Mb29wKGRldmljZVN0YXR1cykpIHtcbiAgICAgIHN0YXR1c2VzLnB1c2goRGV2aWNlSW5kaWNhdGlvblN0YXR1cy5jYXJPbkxvb3ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzR2F0ZUJyb2tlbihkZXZpY2VTdGF0dXMpKSB7XG4gICAgICBzdGF0dXNlcy5wdXNoKERldmljZUluZGljYXRpb25TdGF0dXMuZ2F0ZUJyb2tlbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHYXRlVXAoZGV2aWNlU3RhdHVzKSkge1xuICAgICAgc3RhdHVzZXMucHVzaChEZXZpY2VJbmRpY2F0aW9uU3RhdHVzLmdhdGVVcCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNUaWNrZXRJbnNpZGUoZGV2aWNlU3RhdHVzKSkge1xuICAgICAgc3RhdHVzZXMucHVzaChEZXZpY2VJbmRpY2F0aW9uU3RhdHVzLnRpY2tldEluc2lkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXR1c2VzO1xuICB9XG5cbiAgcHVibGljIGdldERldmljZUluZGljYXRpb25TdGF0dXNlc0xvY2FsaXphdGlvbihkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0bykge1xuICAgIGNvbnN0IHN0YXR1c2VzID0gdGhpcy5nZXREZXZpY2VJbmRpY2F0aW9uU3RhdHVzZXMoZGV2aWNlU3RhdHVzKTtcbiAgICByZXR1cm4gc3RhdHVzZXMubWFwKHN0YXR1cyA9PiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGRldmljZUluZGljYXRpb25TdGF0dXNMb2NhbGl6YXRpb24uZ2V0KHN0YXR1cykpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZXZpY2VUeXBlKGRldmljZTogRGV2aWNlRHRvKSB7XG4gICAgbGV0IGRldmljZVR5cGUgPSBEZXZpY2VUeXBlLlVua25vd247XG4gICAgc3dpdGNoIChkZXZpY2UuZGV2aWNlU3RhdHVzPy50eXBlKSB7XG4gICAgICBjYXNlIChEZXZpY2VUeXBlLkNyZWRpdCk6XG4gICAgICAgIGRldmljZVR5cGUgPSBkZXZpY2UuZGV2aWNlU3RhdHVzLmlzQ2FzaFN1cHBvcnRlZCA/IERldmljZVR5cGUuUG9mIDogRGV2aWNlVHlwZS5DcmVkaXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoRGV2aWNlVHlwZS5DYXNoKTpcbiAgICAgICAgLy8gRGV2aWNlVHlwZS5NYXN0ZXIgPSBNQyBYNjBcbiAgICAgICAgZGV2aWNlVHlwZSA9IGRldmljZS5jb21tSUQgPT09IDAgJiYgZGV2aWNlLmNvbW1Qcm90b2NvbFR5cGUgPT09IENvbW1Qcm90b2NvbFR5cGUuVGNwSXBTZXJ2ZXIgPyBEZXZpY2VUeXBlLk1hc3RlciA6IERldmljZVR5cGUuQ2FzaDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkZXZpY2VUeXBlID0gZGV2aWNlLmRldmljZVN0YXR1cz8udHlwZSB8fCBkZXZpY2U/LnR5cGU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZGV2aWNlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0QWdncmVnYXRlZFN0YXR1c1RvQ29tQWdncmVnYXRlZFN0YXR1cyhhZ2dyZWdhdGVkU3RhdHVzOiBBZ2dyZWdhdGVkU3RhdHVzKTogQ29tQWdncmVnYXRlZFN0YXR1cyB7XG4gICAgbGV0IGNvbUFnZ3JlZ2F0ZWRTdGF0dXM6IENvbUFnZ3JlZ2F0ZWRTdGF0dXM7XG5cbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0ZWRTdGF0dXMpIHtcbiAgICAgIGNhc2UgQWdncmVnYXRlZFN0YXR1cy5FUlJPUjpcbiAgICAgICAgY29tQWdncmVnYXRlZFN0YXR1cyA9IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuRXJyb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBZ2dyZWdhdGVkU3RhdHVzLldBUk5JTkc6XG4gICAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBDb21BZ2dyZWdhdGVkU3RhdHVzLldhcm5pbmc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBZ2dyZWdhdGVkU3RhdHVzLk9LOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29tQWdncmVnYXRlZFN0YXR1cyA9IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuT2s7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjb21BZ2dyZWdhdGVkU3RhdHVzO1xuICB9XG5cbiAgcHVibGljIGlzTW9kYWxDb21tYW5kKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmRUeXBlKSB7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5WZW5kR2F0ZTpcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlJlc3RhcnREZXZpY2U6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0Nhck9uTG9vcCA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT4gZGV2aWNlU3RhdHVzPy5sb29wcz8ubGVuZ3RoID4gMCAmJiBkZXZpY2VTdGF0dXM/Lmxvb3BzWzBdLmlzQ2FyT247XG4gIHB1YmxpYyBpc0dhdGVVcCA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT4gdGhpcy5nZXRCYXJyaWVyKGRldmljZVN0YXR1cyk/LnN0YXRlID09PSBCYXJyaWVyU3RhdGUuT3BlbjtcbiAgcHVibGljIGlzR2F0ZUJyb2tlbiA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT4gdGhpcy5nZXRCYXJyaWVyKGRldmljZVN0YXR1cyk/LnN0YXRlID09PSBCYXJyaWVyU3RhdGUuQnJva2VuO1xuICBwdWJsaWMgaXNTdGF0dXNTdXBwb3J0ZWQgPSAoZGV2aWNlVHlwZTogRGV2aWNlVHlwZSkgPT4gU1VQUE9SVEVEX1NUQVRVU19ERVZJQ0VfVFlQRVMuaW5jbHVkZXMoZGV2aWNlVHlwZSk7XG4gIHB1YmxpYyBpc1RpY2tldEluc2lkZSA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT5cbiAgICAoZGV2aWNlU3RhdHVzPy5zd2FsbG93VW5pdCB8fCBkZXZpY2VTdGF0dXM/LnN3YWxsb3dVbml0cz8uZmluZChzID0+IHMudHlwZSA9PT0gU3dhbGxvd1VuaXRUeXBlLlRpY2tldCkpPy5zdGF0dXMgPT09IFN3YWxsb3dVbml0U3RhdHVzLlRpY2tldEluc2lkZTtcblxuICBwcm90ZWN0ZWQgZ2V0QmFycmllciA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IEJhcnJpZXJEdG8gPT4gZGV2aWNlU3RhdHVzPy5iYXJyaWVyIHx8IChkZXZpY2VTdGF0dXM/LmJhcnJpZXJzPy5sZW5ndGggPiAwICYmIGRldmljZVN0YXR1cz8uYmFycmllcnNbMF0pO1xufVxuIl19
554
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kZXZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1zaGFyZWQtbGliL3NyYy9saWJyYXJpZXMvc2VydmljZXMvYmFzZS1kZXZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHakUsT0FBTyxFQUF3QyxFQUFFLEVBQW9CLE1BQU0sTUFBTSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSw0QkFBNEIsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xKLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUsxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFOUUsT0FBTyxFQUNMLGdCQUFnQixFQUFjLFlBQVksRUFBRSx1Q0FBdUMsRUFBRSxzQ0FBc0MsRUFDM0gsMEJBQTBCLEVBQUUsbUNBQW1DLEVBQUUsa0NBQWtDLEVBQ25HLGdCQUFnQixFQUFFLG1DQUFtQyxFQUE4QixVQUFVLEVBQUUsa0NBQWtDLEVBQ3BILDBCQUEwQixF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QU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGUsIG9mLCBPcGVyYXRvckZ1bmN0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tbWFuZE5vdGlmaWNhdGlvbkNvbmZpZywgQ29tbWFuZE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9jb21tYW5kLW5vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25DbGFzcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi1jb25maWcnO1xuaW1wb3J0IHsgZGV2aWNlSW5kaWNhdGlvblN0YXR1c0xvY2FsaXphdGlvbiwgcmVtb3RlQ29tbWFuZExvY2FsaXphdGlvbk1hcCwgU1VQUE9SVEVEX1NUQVRVU19ERVZJQ0VfVFlQRVMgfSBmcm9tICcuLi9jb25zdGFudHMvZGV2aWNlLXR5cGVzLm1vZGFsJztcbmltcG9ydCB7IENvbUFnZ3JlZ2F0ZWRTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9hZ2dyZWdhdGVkLXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IERldmljZUFjdGl2aXR5TGFiZWwsIERldmljZUFjdGl2aXR5U3RhdHVzIH0gZnJvbSAnLi4vZW51bXMvZGV2aWNlLWFjdGl2aXR5LXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IERldmljZUluZGljYXRpb25TdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9kZXZpY2UtaW5kaWNhdGlvbi1zdGF0dXMuZW51bSc7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb24gfSBmcm9tICcuLi9lbnVtcy9sb2NhbGl6YXRpb24uZW51bSc7XG5pbXBvcnQgeyBUcmFjZVBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2FuYWx5dGljcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ21kRGF0YUR0byB9IGZyb20gJy4uL2ludGVyZmFjZXMvY21kLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbmZpZ0RhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMb3N0VGlja2V0RGlhbG9nRGF0YSwgTHByTWlzbWF0Y2hEaWFsb2dEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90aWNrZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZhY2lsaXR5U3RhdGUgfSBmcm9tICcuLi9tb2R1bGVzL2ZhY2lsaXR5L2ZhY2lsaXR5LnN0YXRlJztcbmltcG9ydCB7IFBhcmtNYW5hZ2VyU3RhdGUgfSBmcm9tICcuLi9tb2R1bGVzL3BhcmstbWFuYWdlci9wYXJrLW1hbmFnZXIuc3RhdGUnO1xuaW1wb3J0IHsgSGFuZGxpbmdCeVVzZXJEdG8sIExQUk1hdGNoQ2FzZUR0bywgUGVyaXBoZXJhbEVxdWlwbWVudEVycm9yIH0gZnJvbSAnLi4vc2VydmljZS1wcm94eS9jbG91ZC1zZXJ2aWNlLXByb3hpZXMnO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRlZFN0YXR1cywgQmFycmllckR0bywgQmFycmllclN0YXRlLCBDaGFuZ2VEZXZpY2VBY2Nlc3NNb2RlUmVtb3RlQ29tbWFuZERhdGEsIENsb3NlR2F0ZUNvbnRpbnVvdXNseVJlbW90ZUNvbW1hbmREYXRhLFxuICBDbG9zZUdhdGVSZW1vdGVDb21tYW5kRGF0YSwgQ2xvc2VQYXltZW50U2NyZWVuUmVtb3RlQ29tbWFuZERhdGEsIENsb3NlVGlja2V0Rm9ySVNGUmVtb3RlQ29tbWFuZERhdGEsIENvbW1hbmRSZXBseUh0dHBSZXNwb25zZURhdGEsXG4gIENvbW1Qcm90b2NvbFR5cGUsIERlbGl2ZXJCdW5kbGVCaWxsc1JlbW90ZUNvbW1hbmREYXRhLCBEZXZpY2VEdG8sIERldmljZVN0YXR1c0R0bywgRGV2aWNlVHlwZSwgRWplY3RKYW1tZWRUaWNrZXRSZW1vdGVDb21tYW5kRGF0YSxcbiAgRmFjaWxpdHlEdG8sIEhvbGRSZWxheVJlbW90ZUNvbW1hbmREYXRhLCBJbnNlcnRWaXJ0dWFsVGlja2V0UmVtb3RlQ29tbWFuZERhdGEsIExhbmVSZWNvZ25pdGlvblN0YXR1c1R5cGUsIExvY2tDYXNoUmVnaXN0ZXJSZW1vdGVDb21tYW5kRGF0YSxcbiAgT3BlbkdhdGVDb250aW51b3VzbHlSZW1vdGVDb21tYW5kRGF0YSwgT3BlblJlbGF5UmVtb3RlQ29tbWFuZERhdGEsIFByaW50VGlja2V0UmVtb3RlQ29tbWFuZERhdGEsIFJlbW90ZUNvbW1hbmRCYXNlLFxuICBSZW1vdGVDb21tYW5kRGV2aWNlUGF5bG9hZCwgUmVtb3RlQ29tbWFuZFR5cGVzLCBSZXNldEJpbGxEaXNwZW5zZXJSZW1vdGVDb21tYW5kRGF0YSwgUmVzZXREZXZpY2VBY2Nlc3NNb2RlUmVtb3RlQ29tbWFuZERhdGEsXG4gIFJlc3RhcnREZXZpY2VSZW1vdGVDb21tYW5kRGF0YSwgU2V0UHJpY2VSZW1vdGVDb21tYW5kRGF0YSwgU2V0UmF0ZVJlbW90ZUNvbW1hbmREYXRhLCBTd2FsbG93SmFtbWVkVGlja2V0UmVtb3RlQ29tbWFuZERhdGEsXG4gIFN3YWxsb3dVbml0U3RhdHVzLCBTd2FsbG93VW5pdFR5cGUsIFRyaWdnZXJMcHJSZW1vdGVDb21tYW5kRGF0YSwgVHlwZUNhc3QsIFVubG9ja0Rvb3JSZW1vdGVDb21tYW5kRGF0YSwgVmFsaWRhdGVSZW1vdGVDb21tYW5kRGF0YSxcbiAgVmVuZEdhdGVSZW1vdGVDb21tYW5kRGF0YVxufSBmcm9tICcuLi9zZXJ2aWNlLXByb3h5L3JwYy1zZXJ2aWNlLXByb3hpZXMnO1xuaW1wb3J0IHsgaXNEZXZpY2VEaXNwbGF5ZWRBY3RpdmUgfSBmcm9tICcuLi91dGlscy9hY3RpdmUtZGV2aWNlLXN0YXR1cy51dGlsJztcbmltcG9ydCB7IEFwcFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4vYXBwLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVtb3RlQ29tbWFuZFNlcnZpY2UgfSBmcm9tICcuL3JlbW90ZS1jb21tYW5kLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZURldmljZVNlcnZpY2Uge1xuXG4gIEBPdXRwdXQoKSBsb2FkaW5nQ29tbWFuZCQ6IEV2ZW50RW1pdHRlcjx7IGNvbW1hbmRUeXBlOiBudW1iZXIsIGlzTG9hZGluZzogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb21tYW5kVHlwZTogbnVtYmVyLCBpc0xvYWRpbmc6IGJvb2xlYW4gfT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RvcmU6IFN0b3JlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIHJlbW90ZUNvbW1hbmRTZXJ2aWNlOiBSZW1vdGVDb21tYW5kU2VydmljZSxcbiAgICBwdWJsaWMgYXBwU2V0dGluZ3NTZXJ2aWNlOiBBcHBTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHVibGljIGNvbW1hbmROb3RpZmljYXRpb25TZXJ2aWNlOiBDb21tYW5kTm90aWZpY2F0aW9uU2VydmljZSkge1xuICB9XG5cbiAgcHVibGljIHNlbmRDb21tYW5kKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMsIGRldmljZUlkOiBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHt9LCBhbmFseXRpY3NQYXlsb2FkOiBUcmFjZVBheWxvYWQgPSB7fSk6IE9ic2VydmFibGU8eyBwYXlsb2FkRGF0YTogUmVtb3RlQ29tbWFuZEJhc2UsIHJlc3BvbnNlOiBDb21tYW5kUmVwbHlIdHRwUmVzcG9uc2VEYXRhIH0+IHtcbiAgICBjb25zdCBndWlkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgIGNvbnN0IGRldmljZTogRGV2aWNlRHRvID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChQYXJrTWFuYWdlclN0YXRlLmJ5SWQpW2RldmljZUlkXTtcbiAgICBvcHRpb25zLmRldmljZVN0YXR1cyA9IGRldmljZS5kZXZpY2VTdGF0dXM7XG4gICAgY29uc3QgY21kRGF0YUR0byQgPSB0aGlzLmdldERldmljZVJlbW90ZUNvbW1hbmREYXRhKGNvbW1hbmRUeXBlLCBvcHRpb25zKVxuICAgICAgLnBpcGUodGhpcy5wcm9jY2VzRGV2aWNlUGF5bG9hZERhdGEoZGV2aWNlSWQpKTtcblxuICAgIGNvbnN0IGRldmljZVBheUxvYWQgPSBuZXcgUmVtb3RlQ29tbWFuZERldmljZVBheWxvYWQoKTtcbiAgICBkZXZpY2VQYXlMb2FkLm5hbWUgPSBkZXZpY2U/Lm5hbWU7XG4gICAgZGV2aWNlUGF5TG9hZC5pZCA9IGRldmljZUlkO1xuXG4gICAgcmV0dXJuIHRoaXMucmVtb3RlQ29tbWFuZFNlcnZpY2Uuc2VuZChjbWREYXRhRHRvJCwgZ3VpZCwgZGV2aWNlUGF5TG9hZCwgYW5hbHl0aWNzUGF5bG9hZCkucGlwZSh0aGlzLnN0b3BMb2FkaW5nQ29tbWFuZChjb21tYW5kVHlwZSkpO1xuICB9XG5cbiAgcHVibGljIHNlbmRDb21tYW5kV2l0aFNuYWNrRGF0YShjb21tYW5kVHlwZTogUmVtb3RlQ29tbWFuZFR5cGVzLCBkZXZpY2VJZDogbnVtYmVyLCBvcHRpb25zOiBhbnkgPSB7fSwgYW5hbHl0aWNzUGF5bG9hZDogVHJhY2VQYXlsb2FkID0ge30pOlxuICAgIE9ic2VydmFibGU8eyBwYXlsb2FkRGF0YTogUmVtb3RlQ29tbWFuZEJhc2UsIHJlc3BvbnNlOiBDb21tYW5kUmVwbHlIdHRwUmVzcG9uc2VEYXRhIH0+IHtcbiAgICBpZiAoUmVtb3RlQ29tbWFuZFR5cGVzW2NvbW1hbmRUeXBlXSkge1xuICAgICAgY29uc3QgZ3VpZDogc3RyaW5nID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgICAgY29uc3QgZGV2aWNlOiBEZXZpY2VEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KFBhcmtNYW5hZ2VyU3RhdGUuYnlJZClbZGV2aWNlSWRdO1xuICAgICAgY29uc3QgcGFyazogRmFjaWxpdHlEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KEZhY2lsaXR5U3RhdGUuZmFjaWxpdHlEaWN0aW9uYXJ5KVtndWlkXVtkZXZpY2UucGFya0lEXTtcbiAgICAgIGNvbnN0IHRpY2tldElkZW50aWZpZXIgPSBvcHRpb25zPy50aWNrZXRJZGVudGlmaWVyO1xuICAgICAgY29uc3QgZW50aXR5RGlzcGxheU5hbWUgPSB0aWNrZXRJZGVudGlmaWVyPy5lbnRpdHlEaXNwbGF5TmFtZTtcbiAgICAgIGNvbnN0IGVudGl0eVR5cGVUcmFuc2xhdGUgPSB0aWNrZXRJZGVudGlmaWVyPy5lbnRpdHlUeXBlVHJhbnNsYXRlO1xuXG4gICAgICBjb25zdCBjb25maWc6IENvbW1hbmROb3RpZmljYXRpb25Db25maWcgPSB7XG4gICAgICAgIG1lc3NhZ2VzOiBbe1xuICAgICAgICAgIHZhbHVlOiBgJHtlbnRpdHlUeXBlVHJhbnNsYXRlfSAke2VudGl0eURpc3BsYXlOYW1lfWAsXG4gICAgICAgICAgY2xhc3M6IGVudGl0eURpc3BsYXlOYW1lID8gTm90aWZpY2F0aW9uQ2xhc3Muc3ViVGl0bGUgOiBOb3RpZmljYXRpb25DbGFzcy5ub25lLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IGAke2RldmljZT8ubmFtZX0gfCAjJHtkZXZpY2U/LmNvbW1JRH1gLFxuICAgICAgICAgIGNsYXNzOiBkZXZpY2U/Lm5hbWUgJiYgZGV2aWNlPy5jb21tSUQgPyBOb3RpZmljYXRpb25DbGFzcy5zdWJUaXRsZSA6IE5vdGlmaWNhdGlvbkNsYXNzLm5vbmUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogYCR7cGFyaz8ubmFtZX1gLFxuICAgICAgICAgIGNsYXNzOiBwYXJrID8gTm90aWZpY2F0aW9uQ2xhc3MuYm9keSA6IE5vdGlmaWNhdGlvbkNsYXNzLm5vbmUsXG4gICAgICAgIH1dLFxuICAgICAgICBjb21tYW5kOiB0aGlzLnJlbW90ZUNvbW1hbmRTZXJ2aWNlLmdldFJlbW90ZUNvbW1hbmRUZXh0KGNvbW1hbmRUeXBlLCBvcHRpb25zKSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnNlbmRDb21tYW5kKGNvbW1hbmRUeXBlLCBkZXZpY2VJZCwgb3B0aW9ucywgYW5hbHl0aWNzUGF5bG9hZClcbiAgICAgICAgLnBpcGUodGhpcy5jb21tYW5kTm90aWZpY2F0aW9uU2VydmljZS5kaXNwbGF5KGNvbmZpZykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkxvc3RUaWNrZXQoZ3VpZDogc3RyaW5nLCBwYXJrSWQ6IG51bWJlciwgcGFya05hbWU6IHN0cmluZywgcmVhZGVySWQ6IG51bWJlciwgZGV2aWNlTmFtZTogc3RyaW5nLCBkZXZpY2VJZDogbnVtYmVyLCBoYW5kbGluZ0J5VXNlcjogSGFuZGxpbmdCeVVzZXJEdG8sIGV2ZW50RGVzY3JpcHRpb246IFBlcmlwaGVyYWxFcXVpcG1lbnRFcnJvciwgYW5hbHl0aWNzUGF5bG9hZDogVHJhY2VQYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBjb25maWc6IENvbW1hbmROb3RpZmljYXRpb25Db25maWcgPSB7XG4gICAgICBtZXNzYWdlczogW3tcbiAgICAgICAgdmFsdWU6IGAke2RldmljZU5hbWV9IHwgIyR7cmVhZGVySWR9YCxcbiAgICAgICAgY2xhc3M6IE5vdGlmaWNhdGlvbkNsYXNzLnN1YlRpdGxlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGAke3BhcmtOYW1lfWAsXG4gICAgICAgIGNsYXNzOiBOb3RpZmljYXRpb25DbGFzcy5ib2R5LFxuICAgICAgfV0sXG4gICAgICBjb21tYW5kOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5sb3N0X3RpY2tldClcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9zdFRpY2tldE1vZGFsQ29tbWFuZChndWlkLCBwYXJrSWQsIHBhcmtOYW1lLCByZWFkZXJJZCwgZGV2aWNlTmFtZSwgZGV2aWNlSWQsIGhhbmRsaW5nQnlVc2VyLCBldmVudERlc2NyaXB0aW9uKS5waXBlKHN3aXRjaE1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgaWYgKCFtb2RhbERhdGEpIHtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbWREYXRhRHRvOiBDbWREYXRhRHRvID0ge1xuICAgICAgICBjbWRUeXBlOiBtb2RhbERhdGEuY29tbWFuZFR5cGVPdmVycmlkZSxcbiAgICAgICAgY21kRHRvOiBuZXcgUmVtb3RlQ29tbWFuZEJhc2UoKVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc3ViT3BlcmF0aW9uID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmhhbmRsZUNvbW1hbmRUeXBlT3ZlcnJpZGVOYW1lKG1vZGFsRGF0YS5jb21tYW5kVHlwZU92ZXJyaWRlKSk7XG4gICAgICBjb25maWcuY29tbWFuZCA9IGAke3N1Yk9wZXJhdGlvbn0gKCR7Y29uZmlnLmNvbW1hbmR9KWA7XG5cbiAgICAgIGNvbnN0IGRldmljZVBheUxvYWQgPSBuZXcgUmVtb3RlQ29tbWFuZERldmljZVBheWxvYWQoKTtcbiAgICAgIGRldmljZVBheUxvYWQubmFtZSA9IGRldmljZU5hbWU7XG4gICAgICBkZXZpY2VQYXlMb2FkLmlkID0gZGV2aWNlSWQ7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlbW90ZUNvbW1hbmRTZXJ2aWNlXG4gICAgICAgIC5zZW5kKG9mKHRoaXMuaGFuZGxlVGlja2V0Q29tbWFuZChjbWREYXRhRHRvLCBtb2RhbERhdGEpKS5waXBlKHRoaXMucHJvY2Nlc0RldmljZVBheWxvYWREYXRhKGRldmljZUlkLCBwYXJrSWQpKSwgZ3VpZCwgZGV2aWNlUGF5TG9hZCwgYW5hbHl0aWNzUGF5bG9hZClcbiAgICAgICAgLnBpcGUodGhpcy5jb21tYW5kTm90aWZpY2F0aW9uU2VydmljZS5kaXNwbGF5KGNvbmZpZykpLnBpcGUodGhpcy5zdG9wTG9hZGluZ0NvbW1hbmQoY21kRGF0YUR0by5jbWRUeXBlKSk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIG9uTHByTWlzbWF0Y2goZ3VpZDogc3RyaW5nLCBwYXJrSWQ6IG51bWJlciwgcGFya05hbWU6IHN0cmluZywgcmVhZGVySWQ6IG51bWJlciwgZGV2aWNlTmFtZTogc3RyaW5nLCBkZXZpY2VJZDogbnVtYmVyLCBscHJNYXRjaENhc2U6IExQUk1hdGNoQ2FzZUR0bywgaGFuZGxpbmdCeVVzZXI6IEhhbmRsaW5nQnlVc2VyRHRvLCBldmVudERlc2NyaXB0aW9uOiBQZXJpcGhlcmFsRXF1aXBtZW50RXJyb3IsIGFuYWx5dGljc1BheWxvYWQ6IFRyYWNlUGF5bG9hZCA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnOiBDb21tYW5kTm90aWZpY2F0aW9uQ29uZmlnID0ge1xuICAgICAgbWVzc2FnZXM6IFt7XG4gICAgICAgIHZhbHVlOiBgJHtkZXZpY2VOYW1lfSB8ICMke3JlYWRlcklkfWAsXG4gICAgICAgIGNsYXNzOiBOb3RpZmljYXRpb25DbGFzcy5zdWJUaXRsZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBgJHtwYXJrTmFtZX1gLFxuICAgICAgICBjbGFzczogTm90aWZpY2F0aW9uQ2xhc3MuYm9keSxcbiAgICAgIH1dLFxuICAgICAgY29tbWFuZDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24ubHByX21pc21hdGNoKVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5nZXRMcHJNaXNtYXRjaE1vZGFsQ29tbWFuZChndWlkLCBwYXJrSWQsIHBhcmtOYW1lLCByZWFkZXJJZCwgZGV2aWNlTmFtZSwgbHByTWF0Y2hDYXNlLCBoYW5kbGluZ0J5VXNlciwgZXZlbnREZXNjcmlwdGlvbiwgZGV2aWNlSWQpLnBpcGUoc3dpdGNoTWFwKG1vZGFsRGF0YSA9PiB7XG4gICAgICBpZiAoIW1vZGFsRGF0YSkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbWREYXRhRHRvOiBDbWREYXRhRHRvID0ge1xuICAgICAgICBjbWRUeXBlOiBtb2RhbERhdGEuY29tbWFuZFR5cGVPdmVycmlkZSxcbiAgICAgICAgY21kRHRvOiBuZXcgUmVtb3RlQ29tbWFuZEJhc2UoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN1Yk9wZXJhdGlvbiA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5oYW5kbGVDb21tYW5kVHlwZU92ZXJyaWRlTmFtZShtb2RhbERhdGEuY29tbWFuZFR5cGVPdmVycmlkZSkpO1xuICAgICAgY29uZmlnLmNvbW1hbmQgPSBgJHtzdWJPcGVyYXRpb259ICgke2NvbmZpZy5jb21tYW5kfSlgO1xuXG4gICAgICBjb25zdCBkZXZpY2VQYXlMb2FkID0gbmV3IFJlbW90ZUNvbW1hbmREZXZpY2VQYXlsb2FkKCk7XG4gICAgICBkZXZpY2VQYXlMb2FkLm5hbWUgPSBkZXZpY2VOYW1lO1xuICAgICAgZGV2aWNlUGF5TG9hZC5pZCA9IGRldmljZUlkO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZW1vdGVDb21tYW5kU2VydmljZVxuICAgICAgICAuc2VuZChvZih0aGlzLmhhbmRsZVRpY2tldENvbW1hbmQoY21kRGF0YUR0bywgbW9kYWxEYXRhKSkucGlwZSh0aGlzLnByb2NjZXNEZXZpY2VQYXlsb2FkRGF0YShkZXZpY2VJZCwgcGFya0lkKSksIGd1aWQsIGRldmljZVBheUxvYWQsIGFuYWx5dGljc1BheWxvYWQpXG4gICAgICAgIC5waXBlKHRoaXMuY29tbWFuZE5vdGlmaWNhdGlvblNlcnZpY2UuZGlzcGxheShjb25maWcpKS5waXBlKHRoaXMuc3RvcExvYWRpbmdDb21tYW5kKGNtZERhdGFEdG8uY21kVHlwZSkpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9wTG9hZGluZ0NvbW1hbmQ8VD4oY29tbWFuZFR5cGU6IFJlbW90ZUNvbW1hbmRUeXBlcyk6IE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxUPiB7XG4gICAgcmV0dXJuICRpbnB1dCA9PiAkaW5wdXQucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdDb21tYW5kJC5uZXh0KHsgY29tbWFuZFR5cGUsIGlzTG9hZGluZzogZmFsc2UgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nQ29tbWFuZCQubmV4dCh7IGNvbW1hbmRUeXBlLCBpc0xvYWRpbmc6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0TW9kYWxDb21tYW5kKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMsIGRhdGE6IENvbmZpZ0RhdGEpOiBPYnNlcnZhYmxlPGFueT47XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRMb3N0VGlja2V0TW9kYWxDb21tYW5kKGd1aWQ6IHN0cmluZywgcGFya0lkOiBudW1iZXIsIHBhcmtOYW1lOiBzdHJpbmcsIHJlYWRlcklkOiBudW1iZXIsIGRldmljZU5hbWU6IHN0cmluZywgZGV2aWNlSWQ6IG51bWJlciwgaGFuZGxpbmdCeVVzZXI6IEhhbmRsaW5nQnlVc2VyRHRvLCBldmVudERlc2NyaXB0aW9uOiBQZXJpcGhlcmFsRXF1aXBtZW50RXJyb3IpOiBPYnNlcnZhYmxlPExvc3RUaWNrZXREaWFsb2dEYXRhPjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldExwck1pc21hdGNoTW9kYWxDb21tYW5kKGd1aWQ6IHN0cmluZywgcGFya0lkOiBudW1iZXIsIHBhcmtOYW1lOiBzdHJpbmcsIHJlYWRlcklkOiBudW1iZXIsIGRldmljZU5hbWU6IHN0cmluZywgbHByTWF0Y2hDYXNlOiBMUFJNYXRjaENhc2VEdG8sIGhhbmRsaW5nQnlVc2VyOiBIYW5kbGluZ0J5VXNlckR0bywgZXZlbnREZXNjcmlwdGlvbjogUGVyaXBoZXJhbEVxdWlwbWVudEVycm9yLCBkZXZpY2VJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxMcHJNaXNtYXRjaERpYWxvZ0RhdGE+O1xuXG4gIHByb3RlY3RlZCBnZXREZXZpY2VSZW1vdGVDb21tYW5kRGF0YShjb21tYW5kVHlwZTogUmVtb3RlQ29tbWFuZFR5cGVzLCBvcHRpb25zOiBhbnkgPSB7fSk6IE9ic2VydmFibGU8Q21kRGF0YUR0bz4ge1xuICAgIGNvbnN0IGNtZERhdGFEdG86IENtZERhdGFEdG8gPSB7XG4gICAgICBjbWRUeXBlOiBjb21tYW5kVHlwZSxcbiAgICAgIGNtZER0bzogbmV3IFJlbW90ZUNvbW1hbmRCYXNlKCksXG4gICAgfTtcbiAgICBjb25zdCBkYXRhOiBDb25maWdEYXRhID0geyBjb21tYW5kVHlwZSwgdGlja2V0SWRlbnRpZmllcjogb3B0aW9ucz8udGlja2V0SWRlbnRpZmllciwgb3B0aW9ucyB9O1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5nZXRNb2RhbENvbW1hbmQoY29tbWFuZFR5cGUsIGRhdGEpO1xuICAgIHN3aXRjaCAoY29tbWFuZFR5cGUpIHtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlZlbmRHYXRlOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShcbiAgICAgICAgICBtYXAobW9kYWxEYXRhID0+IHtcbiAgICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2ZW5kR2F0ZUNvbW1hbmQgPSBuZXcgVmVuZEdhdGVSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgICAgdmVuZEdhdGVDb21tYW5kLnRpY2tldElkID0gb3B0aW9ucy50aWNrZXRJZGVudGlmaWVyPy50aWNrZXRJZDtcbiAgICAgICAgICAgIHZlbmRHYXRlQ29tbWFuZC50cmFuc3BvcnRSZWFzb24gPSBtb2RhbERhdGEucmVhc29uO1xuICAgICAgICAgICAgdmVuZEdhdGVDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgdmVuZEdhdGVDb21tYW5kLnR5cGVPZlBhcmtlciA9IG1vZGFsRGF0YS50eXBlIHx8IG9wdGlvbnMudHlwZSB8fCBUeXBlQ2FzdC5JZ25vcmVkO1xuICAgICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSB2ZW5kR2F0ZUNvbW1hbmQ7XG5cbiAgICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNsb3NlR2F0ZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbG9zZUdhdGVDb21tYW5kID0gbmV3IENsb3NlR2F0ZVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBjbG9zZUdhdGVDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlNldFByaWNlOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAobW9kYWxEYXRhID0+IHtcbiAgICAgICAgICBpZiAoIW1vZGFsRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2V0UHJpY2VDb21tYW5kID0gbmV3IFNldFByaWNlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBzZXRQcmljZUNvbW1hbmQudGlja2V0SWQgPSBvcHRpb25zLnRpY2tldElkZW50aWZpZXI/LnRpY2tldElkO1xuICAgICAgICAgIHNldFByaWNlQ29tbWFuZC5wcmljZSA9IG1vZGFsRGF0YS5wcmljZTtcbiAgICAgICAgICBzZXRQcmljZUNvbW1hbmQudHJhbnNwb3J0UmVhc29uID0gbW9kYWxEYXRhLnJlYXNvbjtcbiAgICAgICAgICBzZXRQcmljZUNvbW1hbmQuZGVzY3JpcHRpb24gPSBtb2RhbERhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBzZXRQcmljZUNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuU2V0UmF0ZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKG1vZGFsRGF0YSA9PiB7XG4gICAgICAgICAgaWYgKCFtb2RhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNldFJhdGVDb21tYW5kID0gbmV3IFNldFJhdGVSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIHNldFJhdGVDb21tYW5kLnRpY2tldElkID0gb3B0aW9ucy50aWNrZXRJZGVudGlmaWVyPy50aWNrZXRJZDtcbiAgICAgICAgICBzZXRSYXRlQ29tbWFuZC5yYXRlSWQgPSBtb2RhbERhdGEucmF0ZUlkO1xuICAgICAgICAgIHNldFJhdGVDb21tYW5kLnRyYW5zcG9ydFJlYXNvbiA9IG1vZGFsRGF0YS5yZWFzb247XG4gICAgICAgICAgc2V0UmF0ZUNvbW1hbmQuZGVzY3JpcHRpb24gPSBtb2RhbERhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBzZXRSYXRlQ29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5WYWxpZGF0ZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKG1vZGFsRGF0YSA9PiB7XG4gICAgICAgICAgaWYgKCFtb2RhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRlQ29tbWFuZCA9IG5ldyBWYWxpZGF0ZVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLnRpY2tldElkID0gb3B0aW9ucy50aWNrZXRJZGVudGlmaWVyPy50aWNrZXRJZDtcbiAgICAgICAgICB2YWxpZGF0ZUNvbW1hbmQucHJpY2UgPSBtb2RhbERhdGEucHJpY2U7XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLnByaW50Tm90ZSA9IG1vZGFsRGF0YS5wcmludE5vdGU7XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLnRyYW5zcG9ydFJlYXNvbiA9IG1vZGFsRGF0YS5yZWFzb247XG4gICAgICAgICAgdmFsaWRhdGVDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gdmFsaWRhdGVDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlJlc3RvcmVUaWNrZXQ6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVUaWNrZXRDb21tYW5kKGNtZERhdGFEdG8sIG1vZGFsRGF0YSk7XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNoYW5nZURldmljZUFjY2Vzc01vZGU6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlRGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQgPSBuZXcgQ2hhbmdlRGV2aWNlQWNjZXNzTW9kZVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY2hhbmdlRGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQuZGV2aWNlQWNjZXNzTW9kZSA9IG9wdGlvbnMucmVtb3RlQ21kTmFtZTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IGNoYW5nZURldmljZUFjY2Vzc01vZGVDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkhvbGRSZWxheTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBob2xkUmVsYXlDb21tYW5kID0gbmV3IEhvbGRSZWxheVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgaG9sZFJlbGF5Q29tbWFuZC5yZWxheUluZGV4ID0gb3B0aW9ucy5yZWxheUluZGV4O1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gaG9sZFJlbGF5Q29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5PcGVuUmVsYXk6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3BlblJlbGF5Q29tbWFuZCA9IG5ldyBPcGVuUmVsYXlSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIG9wZW5SZWxheUNvbW1hbmQucmVsYXlJbmRleCA9IG9wdGlvbnMucmVsYXlJbmRleDtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IG9wZW5SZWxheUNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuUmVzZXREZXZpY2VBY2Nlc3NNb2RlOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc2V0RGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQgPSBuZXcgUmVzZXREZXZpY2VBY2Nlc3NNb2RlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHJlc2V0RGV2aWNlQWNjZXNzTW9kZUNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuUmVzZXRCaWxsRGlzcGVuc2VyOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc2V0QmlsbERpc3BlbnNlckNvbW1hbmQgPSBuZXcgUmVzZXRCaWxsRGlzcGVuc2VyUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHJlc2V0QmlsbERpc3BlbnNlckNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuVHJpZ2dlckxQUk1vZHVsZTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB0cmlnZ2VyTHByQ29tbWFuZCA9IG5ldyBUcmlnZ2VyTHByUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHRyaWdnZXJMcHJDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkVqZWN0SmFtbWVkVGlja2V0OlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVqZWN0SmFtbWVkVGlja2V0Q29tbWFuZCA9IG5ldyBFamVjdEphbW1lZFRpY2tldFJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBlamVjdEphbW1lZFRpY2tldENvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuICAgICAgY2FzZSBSZW1vdGVDb21tYW5kVHlwZXMuU3dhbGxvd0phbW1lZFRpY2tldDpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzd2FsbG93SmFtbWVkVGlja2V0Q29tbWFuZCA9IG5ldyBTd2FsbG93SmFtbWVkVGlja2V0UmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHN3YWxsb3dKYW1tZWRUaWNrZXRDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkRlbGl2ZXJCdW5kbGVCaWxsczpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWxpdmVyQnVuZGxlQmlsbHNDb21tYW5kID0gbmV3IERlbGl2ZXJCdW5kbGVCaWxsc1JlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBkZWxpdmVyQnVuZGxlQmlsbHNDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkxvY2tDYXNoUmVnaXN0ZXI6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9ja0Nhc2hSZWdpc3RlckNvbW1hbmQgPSBuZXcgTG9ja0Nhc2hSZWdpc3RlclJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBsb2NrQ2FzaFJlZ2lzdGVyQ29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5PcGVuR2F0ZUNvbnRpbnVvdXNseTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBvcGVuR2F0ZUNvbnRpbnVvdXNseUNvbW1hbmQgPSBuZXcgT3BlbkdhdGVDb250aW51b3VzbHlSZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gb3BlbkdhdGVDb250aW51b3VzbHlDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNsb3NlR2F0ZUNvbnRpbnVvdXNseTpcbiAgICAgICAgcmV0dXJuIG1vZGFsLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbG9zZUdhdGVDb250aW51b3VzbHlDb21tYW5kID0gbmV3IENsb3NlR2F0ZUNvbnRpbnVvdXNseVJlbW90ZUNvbW1hbmREYXRhKCk7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBjbG9zZUdhdGVDb250aW51b3VzbHlDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlJlc3RhcnREZXZpY2U6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXN0YXJ0RGV2aWNlQ29tbWFuZCA9IG5ldyBSZXN0YXJ0RGV2aWNlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHJlc3RhcnREZXZpY2VDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlVubG9ja0Rvb3I6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcChtb2RhbERhdGEgPT4ge1xuICAgICAgICAgIGlmICghbW9kYWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB1bmxvY2tEb29yQ29tbWFuZCA9IG5ldyBVbmxvY2tEb29yUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICB1bmxvY2tEb29yQ29tbWFuZC5wYXNzd29yZCA9IG1vZGFsRGF0YS5wYXNzd29yZDtcbiAgICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IHVubG9ja0Rvb3JDb21tYW5kO1xuXG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLkNsb3NlVGlja2V0Rm9ySVNGOlxuICAgICAgICByZXR1cm4gbW9kYWwucGlwZShtYXAobW9kYWxEYXRhID0+IHtcbiAgICAgICAgICBpZiAoIW1vZGFsRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY2xvc2VUaWNrZXRGb3JJU0ZDb21tYW5kID0gbmV3IENsb3NlVGlja2V0Rm9ySVNGUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQuZHJpdmVyTGljZW5zZSA9IG1vZGFsRGF0YS5kcml2ZXJMaWNlbnNlO1xuICAgICAgICAgIGNsb3NlVGlja2V0Rm9ySVNGQ29tbWFuZC5maXJzdE5hbWUgPSBtb2RhbERhdGEuZmlyc3ROYW1lO1xuICAgICAgICAgIGNsb3NlVGlja2V0Rm9ySVNGQ29tbWFuZC5sYXN0TmFtZSA9IG1vZGFsRGF0YS5sYXN0TmFtZTtcbiAgICAgICAgICBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQuYWRkcmVzcyA9IG1vZGFsRGF0YS5hZGRyZXNzO1xuICAgICAgICAgIGNsb3NlVGlja2V0Rm9ySVNGQ29tbWFuZC5lbWFpbCA9IG1vZGFsRGF0YS5lbWFpbDtcbiAgICAgICAgICBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQucGhvbmUgPSBtb2RhbERhdGEucGhvbmU7XG4gICAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBjbG9zZVRpY2tldEZvcklTRkNvbW1hbmQ7XG5cbiAgICAgICAgICByZXR1cm4gY21kRGF0YUR0bztcbiAgICAgICAgfSkpO1xuXG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5DbG9zZVBheW1lbnRTY3JlZW46XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2xvc2VQYXltZW50U2NyZWVuQ29tbWFuZCA9IG5ldyBDbG9zZVBheW1lbnRTY3JlZW5SZW1vdGVDb21tYW5kRGF0YSgpO1xuICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvID0gY2xvc2VQYXltZW50U2NyZWVuQ29tbWFuZDtcblxuICAgICAgICAgIHJldHVybiBjbWREYXRhRHRvO1xuICAgICAgICB9KSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBtb2RhbC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Nlc0RldmljZVBheWxvYWREYXRhKGRldmljZUlkOiBudW1iZXIsIHBhcmtJZD86IG51bWJlcik6IE9wZXJhdG9yRnVuY3Rpb248Q21kRGF0YUR0bywgQ21kRGF0YUR0bz4ge1xuICAgIHJldHVybiAkaW5wdXQgPT4gJGlucHV0LnBpcGUoXG4gICAgICBtYXAoKGNtZERhdGFEdG86IENtZERhdGFEdG8pID0+IHtcbiAgICAgICAgaWYgKGNtZERhdGFEdG8pIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdDb21tYW5kJC5uZXh0KHsgY29tbWFuZFR5cGU6IGNtZERhdGFEdG8uY21kVHlwZSwgaXNMb2FkaW5nOiB0cnVlIH0pO1xuXG4gICAgICAgICAgLy8gSGFuZGxlIFBhcmtJZFxuICAgICAgICAgIGlmIChwYXJrSWQpIHtcbiAgICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvLnBhcmtJZCA9IHBhcmtJZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZ3VpZDogc3RyaW5nID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgICAgICAgICAgY29uc3QgZGV2aWNlOiBEZXZpY2VEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KFBhcmtNYW5hZ2VyU3RhdGUuYnlJZClbZGV2aWNlSWRdO1xuICAgICAgICAgICAgY29uc3QgcGFyazogRmFjaWxpdHlEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KEZhY2lsaXR5U3RhdGUuZmFjaWxpdHlEaWN0aW9uYXJ5KVtndWlkXVtkZXZpY2UucGFya0lEXTtcbiAgICAgICAgICAgIGNtZERhdGFEdG8uY21kRHRvLnBhcmtJZCA9IHBhcmsuaWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGFuZGxlIFJlYWRlcklkXG4gICAgICAgICAgaWYgKCFjbWREYXRhRHRvLmNtZER0by5yZWFkZXJJZCkge1xuICAgICAgICAgICAgY29uc3QgZGV2aWNlOiBEZXZpY2VEdG8gPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KFBhcmtNYW5hZ2VyU3RhdGUuYnlJZClbZGV2aWNlSWRdO1xuICAgICAgICAgICAgY21kRGF0YUR0by5jbWREdG8ucmVhZGVySWQgPSBkZXZpY2U/LmNvbW1JRDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNtZERhdGFEdG87XG4gICAgICB9XG4gICAgICApKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVUaWNrZXRDb21tYW5kKGNtZERhdGFEdG86IENtZERhdGFEdG8sIG1vZGFsRGF0YTogYW55KTogQ21kRGF0YUR0byB7XG4gICAgY21kRGF0YUR0by5jbWRUeXBlID0gbW9kYWxEYXRhLmNvbW1hbmRUeXBlT3ZlcnJpZGUgfHwgY21kRGF0YUR0by5jbWRUeXBlO1xuICAgIHN3aXRjaCAoY21kRGF0YUR0by5jbWRUeXBlKSB7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5TZXRQcmljZTpcbiAgICAgICAgY29uc3Qgc2V0UHJpY2VDb21tYW5kID0gbmV3IFNldFByaWNlUmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgc2V0UHJpY2VDb21tYW5kLnByaWNlID0gbW9kYWxEYXRhLnByaWNlO1xuICAgICAgICBzZXRQcmljZUNvbW1hbmQudHJhbnNwb3J0UmVhc29uID0gbW9kYWxEYXRhLnJlYXNvbjtcbiAgICAgICAgc2V0UHJpY2VDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICBzZXRQcmljZUNvbW1hbmQucmVhZGVySWQgPSBtb2RhbERhdGEucmVhZGVySWRPdmVycmlkZTtcbiAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBzZXRQcmljZUNvbW1hbmQ7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5QcmludFRpY2tldDpcbiAgICAgICAgY29uc3QgcHJpbnRUaWNrZXRDb21tYW5kID0gbmV3IFByaW50VGlja2V0UmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgcHJpbnRUaWNrZXRDb21tYW5kLnRpY2tldElkID0gbW9kYWxEYXRhLnRpY2tldElkO1xuICAgICAgICBwcmludFRpY2tldENvbW1hbmQudHJhbnNwb3J0UmVhc29uID0gbW9kYWxEYXRhLnJlYXNvbjtcbiAgICAgICAgcHJpbnRUaWNrZXRDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICBwcmludFRpY2tldENvbW1hbmQucmVhZGVySWQgPSBtb2RhbERhdGEucmVhZGVySWRPdmVycmlkZTtcbiAgICAgICAgY21kRGF0YUR0by5jbWREdG8gPSBwcmludFRpY2tldENvbW1hbmQ7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5JbnNlcnRWaXJ0dWFsVGlja2V0OlxuICAgICAgICBjb25zdCBpbnNlcnRWaXJ0dWFsVGlja2V0Q29tbWFuZCA9IG5ldyBJbnNlcnRWaXJ0dWFsVGlja2V0UmVtb3RlQ29tbWFuZERhdGEoKTtcbiAgICAgICAgaW5zZXJ0VmlydHVhbFRpY2tldENvbW1hbmQudGlja2V0SWQgPSBtb2RhbERhdGEudGlja2V0SWQ7XG4gICAgICAgIGluc2VydFZpcnR1YWxUaWNrZXRDb21tYW5kLnRyYW5zcG9ydFJlYXNvbiA9IG1vZGFsRGF0YS5yZWFzb247XG4gICAgICAgIGluc2VydFZpcnR1YWxUaWNrZXRDb21tYW5kLmRlc2NyaXB0aW9uID0gbW9kYWxEYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICBpbnNlcnRWaXJ0dWFsVGlja2V0Q29tbWFuZC5yZWFkZXJJZCA9IG1vZGFsRGF0YS5yZWFkZXJJZE92ZXJyaWRlO1xuICAgICAgICBjbWREYXRhRHRvLmNtZER0byA9IGluc2VydFZpcnR1YWxUaWNrZXRDb21tYW5kO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtZERhdGFEdG87XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbW1hbmRUeXBlT3ZlcnJpZGVOYW1lKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMpOiBzdHJpbmcge1xuICAgIHJldHVybiAocmVtb3RlQ29tbWFuZExvY2FsaXphdGlvbk1hcC5oYXMoY29tbWFuZFR5cGUpKSA/IHJlbW90ZUNvbW1hbmRMb2NhbGl6YXRpb25NYXAuZ2V0KGNvbW1hbmRUeXBlKSA6IExvY2FsaXphdGlvbi51bmtub3duO1xuICB9XG5cbiAgcHVibGljIGdldERldmljZUNvbW11bmljYXRpb25QZXJjZW50YWdlVGV4dChkZXZpY2U6IERldmljZUR0bykge1xuICAgIGxldCB2YWx1ZSA9ICctJztcbiAgICBpZiAoZGV2aWNlLmNvbW1JRCA+IDApIHtcbiAgICAgIC8vIFNQUkszLTE0NjA4OiBhIHZpcnR1YWwgZGV2aWNlIHJlcG9ydHMgaXRzIHJlYWwgY29tbXVuaWNhdGlvbiB2YWx1ZSwgbm90IHRoZSBJbmFjdGl2ZSBsYWJlbFxuICAgICAgaWYgKCFpc0RldmljZURpc3BsYXllZEFjdGl2ZShkZXZpY2UpKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChEZXZpY2VBY3Rpdml0eUxhYmVsLmdldChEZXZpY2VBY3Rpdml0eVN0YXR1cy5JbmFjdGl2ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzU3RhdHVzU3VwcG9ydGVkKGRldmljZS50eXBlKSkge1xuICAgICAgICB2YWx1ZSA9IGAke2RldmljZS5kZXZpY2VTdGF0dXM/LmNvbW11bmljYXRpb25QZXJjZW50YWdlIHx8IDB9JWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU1BSSzMtMTQ2OTM6IGEgdmlydHVhbCBkZXZpY2UgaGFzIG5vIGhhcmR3YXJlIGNvbW11bmljYXRpb24gbGluaywgc28gYSBjb21tdW5pY2F0aW9uIHN0YXR1cyBpc1xuICAgKiBtZWFuaW5nbGVzcyBmb3IgaXQuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIGEgRmVuY2VyIExQUiBjYW1lcmEsIHdoaWNoIHJlcG9ydHMgYSByZWFsIHN0YXRlIHRocm91Z2hcbiAgICogZGV2aWNlU3RhdHVzLmxhbmVSZWNvZ25pdGlvbi4gVGhlc2UgdHdvIGRlY2lkZSwgZm9yIGEgd2hvbGUgZGV2aWNlLCB3aGV0aGVyIGEgc3RhdHVzIGluZGljYXRvciBpc1xuICAgKiBzaG93biBhbmQgd2hhdCBjb2xvdXIgaXQgdGFrZXMgLSB1bmxpa2UgaXNTdGF0dXNTdXBwb3J0ZWQvZ2V0RGV2aWNlQ29tQWdncmVnYXRlZFN0YXR1cywgd2hpY2ggc2VlXG4gICAqIG9ubHkgdGhlIHR5cGUgb3IgdGhlIHN0YXR1cyBEVE8gYW5kIHNvIGNhbm5vdCB0ZWxsIGEgdmlydHVhbCBkZXZpY2UgYXBhcnQuXG4gICAqL1xuICBwdWJsaWMgaXNTdGF0dXNTdXBwb3J0ZWRGb3JEZXZpY2UoZGV2aWNlOiBEZXZpY2VEdG8pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGV2aWNlPy5pc1ZpcnR1YWxcbiAgICAgID8gISF0aGlzLmdldExhbmVSZWNvZ25pdGlvbkNvbUFnZ3JlZ2F0ZWRTdGF0dXMoZGV2aWNlKVxuICAgICAgOiB0aGlzLmlzU3RhdHVzU3VwcG9ydGVkKGRldmljZT8udHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tQWdncmVnYXRlZFN0YXR1c0ZvckRldmljZShkZXZpY2U6IERldmljZUR0byk6IENvbUFnZ3JlZ2F0ZWRTdGF0dXMge1xuICAgIHJldHVybiBkZXZpY2U/LmlzVmlydHVhbFxuICAgICAgPyB0aGlzLmdldExhbmVSZWNvZ25pdGlvbkNvbUFnZ3JlZ2F0ZWRTdGF0dXMoZGV2aWNlKVxuICAgICAgOiB0aGlzLmdldERldmljZUNvbUFnZ3JlZ2F0ZWRTdGF0dXMoZGV2aWNlPy5kZXZpY2VTdGF0dXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBzYW1lIGFwcC1zZXR0aW5ncyBkZXZpY2VTdGF0dXNNYXBwaW5nLkxhbmVSZWNvZ25pdGlvbiB0aGUgTFBSIHRhZyBvbiB0aGUgZGV2aWNlIHBhZ2VcbiAgICogdXNlcyAoQWN0aXZlIDEsIFNlbWlBY3RpdmUgMiwgTm9BY3RpdmUgMyksIHdoaWNoIGxhbmRzIG9uIENvbUFnZ3JlZ2F0ZWRTdGF0dXMgT2sgLyBXYXJuaW5nIC9cbiAgICogRXJyb3I6IGdyZWVuIC8geWVsbG93IC8gcmVkLiBVbmRlZmluZWQgZm9yIGEgY2FtZXJhIHRoYXQgaGFzIG5vdCByZXBvcnRlZCBhbiBMUFIgc3RhdGUgeWV0IC1cbiAgICogd2hpY2ggaXMgd2hhdCBtYWtlcyBpc1N0YXR1c1N1cHBvcnRlZEZvckRldmljZSBmYWxzZSBmb3IgaXQsIHNvIHRoZSB0d28gYWx3YXlzIGFncmVlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMYW5lUmVjb2duaXRpb25Db21BZ2dyZWdhdGVkU3RhdHVzKGRldmljZTogRGV2aWNlRHRvKTogQ29tQWdncmVnYXRlZFN0YXR1cyB7XG4gICAgY29uc3QgbGFuZVJlY29nbml0aW9uU3RhdHVzID0gZGV2aWNlPy5kZXZpY2VTdGF0dXM/LmxhbmVSZWNvZ25pdGlvbj8uc3RhdHVzO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLmRldmljZVN0YXR1c01hcHBpbmcuTGFuZVJlY29nbml0aW9uW0xhbmVSZWNvZ25pdGlvblN0YXR1c1R5cGVbbGFuZVJlY29nbml0aW9uU3RhdHVzXV07XG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlQ29tQWdncmVnYXRlZFN0YXR1cyhkZXZpY2VTdGF0dXNEYXRhOiBEZXZpY2VTdGF0dXNEdG8sIGlzQ29tU3RhdHVzID0gZmFsc2UpOiBDb21BZ2dyZWdhdGVkU3RhdHVzIHtcbiAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIGFuIE1DIChjb21taWQgPT09IDApIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBQYXJrIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiB0aGUgRGV2aWNlXG4gICAgbGV0IGNvbUFnZ3JlZ2F0ZWRTdGF0dXM6IENvbUFnZ3JlZ2F0ZWRTdGF0dXM7XG5cbiAgICBpZiAoZGV2aWNlU3RhdHVzRGF0YT8uY29tbUlEID09PSAwKSB7XG4gICAgICBjb25zdCBndWlkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgICAgY29uc3QgcGFya0lkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChQYXJrTWFuYWdlclN0YXRlLmJ5SWQpW2RldmljZVN0YXR1c0RhdGEuZGV2aWNlSURdLnBhcmtJRDtcbiAgICAgIGNvbnN0IGZhY2lsaXR5ID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmZhY2lsaXR5RGljdGlvbmFyeSlbZ3VpZF1bcGFya0lkXTtcbiAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBmYWNpbGl0eT8uaXNNYWluQ29udHJvbGxlckNvbm5lY3RlZCA/IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuT2sgOiBDb21BZ2dyZWdhdGVkU3RhdHVzLkNvbUVycm9yO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNhbGN1bGF0ZXMgdGhlIGNvbW11bmljYXRpb24gc3RhdHVzIG9mIHRoZSBkZXZpY2VcbiAgICAgIGlmICghZGV2aWNlU3RhdHVzRGF0YT8uaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgY29tQWdncmVnYXRlZFN0YXR1cyA9IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuQ29tRXJyb3I7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCZXR3ZWVuUmFuZ2UoZGV2aWNlU3RhdHVzRGF0YT8uY29tbXVuaWNhdGlvblBlcmNlbnRhZ2UudG9TdHJpbmcoKSwgMSwgNzApKSB7XG4gICAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBDb21BZ2dyZWdhdGVkU3RhdHVzLldhcm5pbmc7XG4gICAgICB9IGVsc2UgaWYgKGRldmljZVN0YXR1c0RhdGE/LmNvbW11bmljYXRpb25QZXJjZW50YWdlID49IDcxKSB7XG4gICAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBDb21BZ2dyZWdhdGVkU3RhdHVzLk9rO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGFsc28gY2FsY3VsYXRlcyB0aGUgZGV2aWNlcyBBZ2dyZWdhdGVkU3RhdHVzIGFuZCBjb21wYXJlcyB0byB0aGUgY29tbXVuaWNhdGlvbiBBZ2dyZWdhdGVkU3RhdHVzXG4gICAgICAvLyBIaWdoTGV2ZWwgbGVmdCBpbmRpY2F0b3IsIGxpc3QvZ2FsYXJ5IHZpZXdcbiAgICAgIGNvbnN0IGRldmljZUFnZ3JlZ2F0ZWRTdGF0dXMgPSB0aGlzLmNvbnZlcnRBZ2dyZWdhdGVkU3RhdHVzVG9Db21BZ2dyZWdhdGVkU3RhdHVzKGRldmljZVN0YXR1c0RhdGE/LmFnZ3JlZ2F0ZWRTdGF0dXMpO1xuICAgICAgaWYgKCFpc0NvbVN0YXR1cyAmJiBkZXZpY2VBZ2dyZWdhdGVkU3RhdHVzID4gY29tQWdncmVnYXRlZFN0YXR1cykge1xuICAgICAgICBjb21BZ2dyZWdhdGVkU3RhdHVzID0gZGV2aWNlQWdncmVnYXRlZFN0YXR1cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuZGV2aWNlU3RhdHVzTWFwcGluZy5Db21bQ29tQWdncmVnYXRlZFN0YXR1c1tjb21BZ2dyZWdhdGVkU3RhdHVzXV07XG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlQ29tQWdncmVnYXRlZFN0YXR1c0NsYXNzKGRldmljZTogRGV2aWNlRHRvKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGF0dXNDbGFzc2VzOiBzdHJpbmdbXSA9IFsnaGlnaC1sZXZlbCddO1xuXG4gICAgLy8gU1BSSzMtMTQ2MDg6IGEgdmlydHVhbCBkZXZpY2Uga2VlcHMgaXRzIHJlYWwgY29tbXVuaWNhdGlvbiBzdGF0dXMgY2xhc3MgaW5zdGVhZCBvZiB0aGVcbiAgICAvLyBpbmFjdGl2ZSBvbmUuIFRoZSBkZXZpY2UgZGV0YWlsIHBhZ2UgcGFzc2VzIHRoaXMgY2xhc3MgaW50byB0Yi12aXJ0dWFsLWRldmljZSwgd2hpY2hcbiAgICAvLyBhcHBsaWVzIGl0IHRvIHRoZSBwYW5lbCBoZWFkZXIgYm9yZGVyLlxuICAgIC8vIFNQUkszLTE0NjkzOiB3aGljaCBzdGF0dXMgdGhhdCBpcyBoYXMgdG8gZm9sbG93IHRoZSBzYW1lIHBlci1kZXZpY2UgcnVsZSBhcyB0aGUgaW5kaWNhdG9yLFxuICAgIC8vIG9yIGEgdmlydHVhbCBkZXZpY2Ugd2l0aCBubyBjb21tdW5pY2F0aW9uIGxpbmsgc3RpbGwgZ2V0cyBhIGNvbS1lcnJvciBib3JkZXIgaGVyZS5cbiAgICBpZiAoIWlzRGV2aWNlRGlzcGxheWVkQWN0aXZlKGRldmljZSkpIHtcbiAgICAgIHN0YXR1c0NsYXNzZXMucHVzaCgnaW5hY3RpdmUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTdGF0dXNTdXBwb3J0ZWRGb3JEZXZpY2UoZGV2aWNlKSkge1xuICAgICAgY29uc3QgZGV2aWNlQWdncmVnYXRlZFN0YXR1cyA9IHRoaXMuZ2V0Q29tQWdncmVnYXRlZFN0YXR1c0ZvckRldmljZShkZXZpY2UpO1xuICAgICAgc3RhdHVzQ2xhc3Nlcy5wdXNoKENvbUFnZ3JlZ2F0ZWRTdGF0dXNbZGV2aWNlQWdncmVnYXRlZFN0YXR1c10udG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXR1c0NsYXNzZXMuam9pbihcIiBcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNCZXR3ZWVuUmFuZ2UoaW5wdXQ6IHN0cmluZywgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGlucHV0VmFsID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICByZXR1cm4gaW5wdXRWYWwgPj0gbWluVmFsdWUgJiYgaW5wdXRWYWwgPD0gbWF4VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlSW5kaWNhdGlvblN0YXR1c2VzKGRldmljZVN0YXR1czogRGV2aWNlU3RhdHVzRHRvKSB7XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ2FyT25Mb29wKGRldmljZVN0YXR1cykpIHtcbiAgICAgIHN0YXR1c2VzLnB1c2goRGV2aWNlSW5kaWNhdGlvblN0YXR1cy5jYXJPbkxvb3ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzR2F0ZUJyb2tlbihkZXZpY2VTdGF0dXMpKSB7XG4gICAgICBzdGF0dXNlcy5wdXNoKERldmljZUluZGljYXRpb25TdGF0dXMuZ2F0ZUJyb2tlbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHYXRlVXAoZGV2aWNlU3RhdHVzKSkge1xuICAgICAgc3RhdHVzZXMucHVzaChEZXZpY2VJbmRpY2F0aW9uU3RhdHVzLmdhdGVVcCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNUaWNrZXRJbnNpZGUoZGV2aWNlU3RhdHVzKSkge1xuICAgICAgc3RhdHVzZXMucHVzaChEZXZpY2VJbmRpY2F0aW9uU3RhdHVzLnRpY2tldEluc2lkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXR1c2VzO1xuICB9XG5cbiAgcHVibGljIGdldERldmljZUluZGljYXRpb25TdGF0dXNlc0xvY2FsaXphdGlvbihkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0bykge1xuICAgIGNvbnN0IHN0YXR1c2VzID0gdGhpcy5nZXREZXZpY2VJbmRpY2F0aW9uU3RhdHVzZXMoZGV2aWNlU3RhdHVzKTtcbiAgICByZXR1cm4gc3RhdHVzZXMubWFwKHN0YXR1cyA9PiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGRldmljZUluZGljYXRpb25TdGF0dXNMb2NhbGl6YXRpb24uZ2V0KHN0YXR1cykpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZXZpY2VUeXBlKGRldmljZTogRGV2aWNlRHRvKSB7XG4gICAgbGV0IGRldmljZVR5cGUgPSBEZXZpY2VUeXBlLlVua25vd247XG4gICAgc3dpdGNoIChkZXZpY2UuZGV2aWNlU3RhdHVzPy50eXBlKSB7XG4gICAgICBjYXNlIChEZXZpY2VUeXBlLkNyZWRpdCk6XG4gICAgICAgIGRldmljZVR5cGUgPSBkZXZpY2UuZGV2aWNlU3RhdHVzLmlzQ2FzaFN1cHBvcnRlZCA/IERldmljZVR5cGUuUG9mIDogRGV2aWNlVHlwZS5DcmVkaXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoRGV2aWNlVHlwZS5DYXNoKTpcbiAgICAgICAgLy8gRGV2aWNlVHlwZS5NYXN0ZXIgPSBNQyBYNjBcbiAgICAgICAgZGV2aWNlVHlwZSA9IGRldmljZS5jb21tSUQgPT09IDAgJiYgZGV2aWNlLmNvbW1Qcm90b2NvbFR5cGUgPT09IENvbW1Qcm90b2NvbFR5cGUuVGNwSXBTZXJ2ZXIgPyBEZXZpY2VUeXBlLk1hc3RlciA6IERldmljZVR5cGUuQ2FzaDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkZXZpY2VUeXBlID0gZGV2aWNlLmRldmljZVN0YXR1cz8udHlwZSB8fCBkZXZpY2U/LnR5cGU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZGV2aWNlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0QWdncmVnYXRlZFN0YXR1c1RvQ29tQWdncmVnYXRlZFN0YXR1cyhhZ2dyZWdhdGVkU3RhdHVzOiBBZ2dyZWdhdGVkU3RhdHVzKTogQ29tQWdncmVnYXRlZFN0YXR1cyB7XG4gICAgbGV0IGNvbUFnZ3JlZ2F0ZWRTdGF0dXM6IENvbUFnZ3JlZ2F0ZWRTdGF0dXM7XG5cbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0ZWRTdGF0dXMpIHtcbiAgICAgIGNhc2UgQWdncmVnYXRlZFN0YXR1cy5FUlJPUjpcbiAgICAgICAgY29tQWdncmVnYXRlZFN0YXR1cyA9IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuRXJyb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBZ2dyZWdhdGVkU3RhdHVzLldBUk5JTkc6XG4gICAgICAgIGNvbUFnZ3JlZ2F0ZWRTdGF0dXMgPSBDb21BZ2dyZWdhdGVkU3RhdHVzLldhcm5pbmc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBZ2dyZWdhdGVkU3RhdHVzLk9LOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29tQWdncmVnYXRlZFN0YXR1cyA9IENvbUFnZ3JlZ2F0ZWRTdGF0dXMuT2s7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjb21BZ2dyZWdhdGVkU3RhdHVzO1xuICB9XG5cbiAgcHVibGljIGlzTW9kYWxDb21tYW5kKGNvbW1hbmRUeXBlOiBSZW1vdGVDb21tYW5kVHlwZXMpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmRUeXBlKSB7XG4gICAgICBjYXNlIFJlbW90ZUNvbW1hbmRUeXBlcy5WZW5kR2F0ZTpcbiAgICAgIGNhc2UgUmVtb3RlQ29tbWFuZFR5cGVzLlJlc3RhcnREZXZpY2U6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0Nhck9uTG9vcCA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT4gZGV2aWNlU3RhdHVzPy5sb29wcz8ubGVuZ3RoID4gMCAmJiBkZXZpY2VTdGF0dXM/Lmxvb3BzWzBdLmlzQ2FyT247XG4gIHB1YmxpYyBpc0dhdGVVcCA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT4gdGhpcy5nZXRCYXJyaWVyKGRldmljZVN0YXR1cyk/LnN0YXRlID09PSBCYXJyaWVyU3RhdGUuT3BlbjtcbiAgcHVibGljIGlzR2F0ZUJyb2tlbiA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT4gdGhpcy5nZXRCYXJyaWVyKGRldmljZVN0YXR1cyk/LnN0YXRlID09PSBCYXJyaWVyU3RhdGUuQnJva2VuO1xuICBwdWJsaWMgaXNTdGF0dXNTdXBwb3J0ZWQgPSAoZGV2aWNlVHlwZTogRGV2aWNlVHlwZSkgPT4gU1VQUE9SVEVEX1NUQVRVU19ERVZJQ0VfVFlQRVMuaW5jbHVkZXMoZGV2aWNlVHlwZSk7XG4gIHB1YmxpYyBpc1RpY2tldEluc2lkZSA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IGJvb2xlYW4gPT5cbiAgICAoZGV2aWNlU3RhdHVzPy5zd2FsbG93VW5pdCB8fCBkZXZpY2VTdGF0dXM/LnN3YWxsb3dVbml0cz8uZmluZChzID0+IHMudHlwZSA9PT0gU3dhbGxvd1VuaXRUeXBlLlRpY2tldCkpPy5zdGF0dXMgPT09IFN3YWxsb3dVbml0U3RhdHVzLlRpY2tldEluc2lkZTtcblxuICBwcm90ZWN0ZWQgZ2V0QmFycmllciA9IChkZXZpY2VTdGF0dXM6IERldmljZVN0YXR1c0R0byk6IEJhcnJpZXJEdG8gPT4gZGV2aWNlU3RhdHVzPy5iYXJyaWVyIHx8IChkZXZpY2VTdGF0dXM/LmJhcnJpZXJzPy5sZW5ndGggPiAwICYmIGRldmljZVN0YXR1cz8uYmFycmllcnNbMF0pO1xufVxuIl19
@@ -124417,6 +124417,33 @@ class BaseDeviceService {
124417
124417
  }
124418
124418
  return value;
124419
124419
  }
124420
+ /**
124421
+ * SPRK3-14693: a virtual device has no hardware communication link, so a communication status is
124422
+ * meaningless for it. The one exception is a Fencer LPR camera, which reports a real state through
124423
+ * deviceStatus.laneRecognition. These two decide, for a whole device, whether a status indicator is
124424
+ * shown and what colour it takes - unlike isStatusSupported/getDeviceComAggregatedStatus, which see
124425
+ * only the type or the status DTO and so cannot tell a virtual device apart.
124426
+ */
124427
+ isStatusSupportedForDevice(device) {
124428
+ return device?.isVirtual
124429
+ ? !!this.getLaneRecognitionComAggregatedStatus(device)
124430
+ : this.isStatusSupported(device?.type);
124431
+ }
124432
+ getComAggregatedStatusForDevice(device) {
124433
+ return device?.isVirtual
124434
+ ? this.getLaneRecognitionComAggregatedStatus(device)
124435
+ : this.getDeviceComAggregatedStatus(device?.deviceStatus);
124436
+ }
124437
+ /**
124438
+ * Reads the same app-settings deviceStatusMapping.LaneRecognition the LPR tag on the device page
124439
+ * uses (Active 1, SemiActive 2, NoActive 3), which lands on ComAggregatedStatus Ok / Warning /
124440
+ * Error: green / yellow / red. Undefined for a camera that has not reported an LPR state yet -
124441
+ * which is what makes isStatusSupportedForDevice false for it, so the two always agree.
124442
+ */
124443
+ getLaneRecognitionComAggregatedStatus(device) {
124444
+ const laneRecognitionStatus = device?.deviceStatus?.laneRecognition?.status;
124445
+ return this.appSettingsService.deviceStatusMapping.LaneRecognition[LaneRecognitionStatusType$1[laneRecognitionStatus]];
124446
+ }
124420
124447
  getDeviceComAggregatedStatus(deviceStatusData, isComStatus = false) {
124421
124448
  // If the device is an MC (commid === 0) we need to translate the Park connection instead of the Device
124422
124449
  let comAggregatedStatus;
@@ -124451,11 +124478,13 @@ class BaseDeviceService {
124451
124478
  // SPRK3-14608: a virtual device keeps its real communication status class instead of the
124452
124479
  // inactive one. The device detail page passes this class into tb-virtual-device, which
124453
124480
  // applies it to the panel header border.
124481
+ // SPRK3-14693: which status that is has to follow the same per-device rule as the indicator,
124482
+ // or a virtual device with no communication link still gets a com-error border here.
124454
124483
  if (!isDeviceDisplayedActive(device)) {
124455
124484
  statusClasses.push('inactive');
124456
124485
  }
124457
- else if (this.isStatusSupported(device?.type)) {
124458
- const deviceAggregatedStatus = this.getDeviceComAggregatedStatus(device.deviceStatus);
124486
+ else if (this.isStatusSupportedForDevice(device)) {
124487
+ const deviceAggregatedStatus = this.getComAggregatedStatusForDevice(device);
124459
124488
  statusClasses.push(ComAggregatedStatus[deviceAggregatedStatus].toLowerCase());
124460
124489
  }
124461
124490
  return statusClasses.join(" ");
@@ -134434,26 +134463,34 @@ class BaseDeviceItemComponent extends BaseComponent {
134434
134463
  this.store = store;
134435
134464
  this.deviceService = deviceService;
134436
134465
  this.cdr = cdr;
134466
+ /**
134467
+ * SPRK3-14693: whether the indicator is shown now depends on deviceStatus.laneRecognition, which
134468
+ * arrives at runtime - an LPR camera that has not reported yet reports one later. So it has to be
134469
+ * refreshed alongside the status, not computed once in ngOnInit as the device type used to be.
134470
+ */
134471
+ this.populateStatusIndicator = () => {
134472
+ this.isStatusSupported = this.deviceService.isStatusSupportedForDevice(this.device);
134473
+ this.populateComAggregatedStatus();
134474
+ };
134437
134475
  this.populateComAggregatedStatus = () => {
134438
- this.comAggregatedStatus = this.deviceService.getDeviceComAggregatedStatus(this.device.deviceStatus);
134476
+ this.comAggregatedStatus = this.deviceService.getComAggregatedStatusForDevice(this.device);
134439
134477
  };
134440
134478
  }
134441
134479
  ngOnChanges(changes) {
134442
134480
  if (changes.device) {
134443
- this.populateComAggregatedStatus();
134481
+ this.populateStatusIndicator();
134444
134482
  }
134445
134483
  }
134446
134484
  ngOnInit() {
134447
134485
  this.isVirtualDevice = this.device?.isVirtual ?? false;
134448
134486
  this.activeStatus = isDeviceDisplayedActive(this.device);
134449
134487
  this.isMultiPark = !!this.store.selectSnapshot(FacilityState.isMultiPark);
134450
- this.isStatusSupported = this.deviceService.isStatusSupported(this.device.type);
134451
- this.populateComAggregatedStatus();
134488
+ this.populateStatusIndicator();
134452
134489
  // Only MC is being updated with this, other devices have events for themselves
134453
134490
  if (this.device.commID === 0) {
134454
134491
  const guid = this.store.selectSnapshot(FacilityState.guid);
134455
134492
  this.store.select(FacilityState.parkConnectionStatusMap).pipe(takeUntil$1(this.destroy$), filter((connectionMap) => !!connectionMap[guid] && !!this.device), distinctUntilChanged((prev, curr) => prev[guid][this.device.parkID]?.status === curr[guid][this.device.parkID]?.status)).subscribe(() => {
134456
- this.populateComAggregatedStatus();
134493
+ this.populateStatusIndicator();
134457
134494
  this.cdr.detectChanges();
134458
134495
  });
134459
134496
  }