@softheon/armature 17.16.4 → 17.16.5

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.
@@ -0,0 +1,3 @@
1
+ {
2
+ "module": "../fesm2022/softheon-armature-ag-grid-components.mjs"
3
+ }
@@ -295,6 +295,7 @@ export class SofTableComponent {
295
295
  this.gridApi.setFilterModel(null);
296
296
  // Update the display
297
297
  this.gridApi.onFilterChanged();
298
+ this.filterCount = this.getFilterCount();
298
299
  }
299
300
  /**
300
301
  * Returns true if no filters are selected
@@ -515,4 +516,4 @@ class SofTableFilter {
515
516
  /** A filter combining multiple conditions, taken from AgGrid*/
516
517
  class CombinedSimpleModel {
517
518
  }
518
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL2FnLWdyaWQtY29tcG9uZW50cy9zcmMvc29mLXRhYmxlL3NvZi10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9hZy1ncmlkLWNvbXBvbmVudHMvc3JjL3NvZi10YWJsZS9zb2YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUVOLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUdMLHlCQUF5QixFQUMxQixNQUFNLGtEQUFrRCxDQUFDO0FBZ0IxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELDRDQUE0QztBQU01QyxNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBT0Usc0VBQXNFO1FBQ3RELFlBQU8sR0FBZSxFQUFFLENBQUM7UUFFekMsMkRBQTJEO1FBQzNDLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBSzVDLGtCQUFrQjtRQUNGLCtCQUEwQixHQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlFLG9CQUFvQjtRQUNKLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdDLDBDQUEwQztRQUMxQixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3Qyw0Q0FBNEM7UUFDNUIsd0JBQW1CLEdB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QUFPO3NCQUF0QixLQUFLO2dCQUdXLFFBQVE7c0JBQXhCLEtBQUs7Z0JBR1UsMEJBQTBCO3NCQUF6QyxLQUFLO2dCQUdVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBR1UsWUFBWTtzQkFBM0IsS0FBSztnQkFHVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBR1UsWUFBWTtzQkFBM0IsS0FBSztnQkFXVSx5QkFBeUI7c0JBQXhDLEtBQUs7Z0JBTVUsU0FBUztzQkFBeEIsS0FBSztnQkFHVyxnQkFBZ0I7c0JBQWhDLEtBQUs7Z0JBR1csa0JBQWtCO3NCQUFsQyxLQUFLO2dCQUdJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFHRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBRzJCLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBR00sZ0JBQWdCO3NCQUFyRCxTQUFTO3VCQUFDLGtCQUFrQjs7QUFzZS9CLHFDQUFxQztBQUNyQyxNQUFNLGNBQWM7SUFBcEI7UUFLRSxnQ0FBZ0M7UUFDaEMsWUFBTyxHQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQUE7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxtQkFBbUI7Q0FPeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBcclxuICBDb21wb25lbnQsIFxyXG4gIEVsZW1lbnRSZWYsIFxyXG4gIEV2ZW50RW1pdHRlciwgXHJcbiAgaW5qZWN0LCBcclxuICBJbnB1dCwgXHJcbiAgT25DaGFuZ2VzLCBcclxuICBPbkluaXQsIFxyXG4gIE91dHB1dCwgXHJcbiAgc2lnbmFsLCBcclxuICBTaW1wbGVDaGFuZ2VzLCBcclxuICBWaWV3Q2hpbGQsIFxyXG4gIFdyaXRhYmxlU2lnbmFsIFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgdGFrZSwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcblxyXG5pbXBvcnQgeyBcclxuICBDb2x1bW5EYXRhLCBcclxuICBDb2x1bW5PcHRpb25zRGF0YSwgXHJcbiAgU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudCBcclxufSBmcm9tICcuLi9jb2x1bW4tb3B0aW9ucy1tb2RhbC9jb2x1bW4tb3B0aW9ucy5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBcHBseUNvbHVtblN0YXRlUGFyYW1zLFxyXG4gIENvbERlZixcclxuICBDb2x1bW4sXHJcbiAgQ29sdW1uU3RhdGUsXHJcbiAgRmlsdGVyTW9kZWwsXHJcbiAgR3JpZEFwaSxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBJUm93Tm9kZSxcclxuICBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50LFxyXG4gIFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtcyxcclxuICBUZXh0RmlsdGVyTW9kZWxcclxufSBmcm9tIFwiYWctZ3JpZC1jb21tdW5pdHlcIjtcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbi8qKiBUaGUgU29mdGhlb24gQXJtYXR1cmUgVGFibGUgY29tcG9uZW50ICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU29mVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKiBUaGUgbGFuZ3VhZ2UgdGV4dCBvciBhIGtleSB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhpcyBjb21wb25lbnQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcm93RGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAvKiogQ29sdW1uIERlZmluaXRpb25zOiBEZWZpbmVzICYgY29udHJvbHMgZ3JpZCBjb2x1bW5zLiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xEZWZzOiBBcnJheTxDb2xEZWY+ID0gW107XHJcblxyXG4gIC8qKiBTaXplIG1vZGVzIGZvciB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgc2l6ZU1vZGU6ICdDb21wYWN0JyB8ICdSb29teScgfCAnRGVmYXVsdCc7XHJcblxyXG4gIC8qKiBQYWdlcyBzaXplcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjogQXJyYXk8bnVtYmVyPiA9IFsxMCwgMjAsIDUwLCAxMDBdO1xyXG5cclxuICAvKiogRW5hYmxlIHNlYXJjaCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogRW5hYmxlIGN1c3RvbSB0ZXh0IGZpbHRlciBkcm9wZG93bnMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIEVuYWJsZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCBzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlQ29sdW1uT3B0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBFbmFibGUgZXhwb3J0IGJ1dHRvbiB0byBvdXRwdXQgZmlsdGVyZWQgcm93IGRhdGEgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRXhwb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBUbyBkaXNwbGF5IHRoZSB0ZXh0IG9uIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCwgd2hpY2ggc3RhdGVzIC1cclxuICAgKiBgXCJPcHRpb25zIHdpbGwgYmUgc2F2ZWQgZm9yIHRoZSBuZXh0IHRpbWUgeW91IGxvZyBpbi5cImBcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEBkZXNjcmlwdGlvbiBzZXQgdG8gdHJ1ZSBpZiBzZXQtdXAgZm9yIHNhdmluZyBwcmVmZXJlbmNlcyB0byBVc2VyIGRhdGEuXHJcbiAgICogQG5vdGUgWW91IGNhbiBzdGlsbCBzYXZlIHByZWZlcmVuY2VzIHRvIF9sb2NhbF8gb3IgX3Nlc3Npb25fIHN0b3JhZ2VcclxuICAgKiB1c2luZyB0aGUgYHNhdmVkQ29sdW1uU3RhdGVgIGlucHV0LCBhbmQgYHVwZGF0ZWRDb2x1bW5TdGF0ZWAgb3V0cHV0IGV2ZW50LlxyXG4gICAqIEBzZWUgVGhlIERlbW8gc2l0ZSBpcyBzYXZpbmcgdG8gbG9jYWwgc3RvcmFnZS5cclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBOYW1lL2xhYmVsIG9mIHRoZSB0YWJsZSBcclxuICAgKiBAbm90ZSBzaG91bGQgYmUgYSB0cmFuc2xhdGlvbiBrZXlcclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZU5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFVzZXJzIHNhdmVkIGNvbHVtbiBvcHRpb25zIHN0YXRlICovXHJcbiAgQElucHV0KCkgcHJpdmF0ZSBzYXZlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zO1xyXG5cclxuICAvKiogSW5pdGlhbCBmaWx0ZXIgbW9kZWwgKi9cclxuICBASW5wdXQoKSBwcml2YXRlIGluaXRpYWxGaWx0ZXJNb2RlbDogRmlsdGVyTW9kZWw7XHJcblxyXG4gIC8qKiBPdXRwdXQgdXBkYXRlZCBjb2x1bW4gb3B0aW9ucyBldmVudCB0byBzYXZlIHRvIHVzZXIgb3IgYnJvd3NlciBzdG9yYWdlICovXHJcbiAgQE91dHB1dCgpIHVwZGF0ZWRDb2x1bW5TdGF0ZTogRXZlbnRFbWl0dGVyPEFwcGx5Q29sdW1uU3RhdGVQYXJhbXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKiogT3V0cHV0IHVwZGF0ZWQgY29sdW1uIG9wdGlvbnMgZXZlbnQgdG8gc2F2ZSB0byB1c2VyIG9yIGJyb3dzZXIgc3RvcmFnZSAqL1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJlZFJvd0RhdGFGb3JFeHBvcnQ6IEV2ZW50RW1pdHRlcjxFeHBvcnRUYWJsZURhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKiogdGhlIHNlYXJjaCBpbnB1dCAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2dyaWRTZWFyY2hUZXh0SW5wdXQnKSBncmlkU2VhcmNoVGV4dElucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAvKiogVGhlIGhpZGRlbiBlbGVtZW50IHRoYXQgYW5ub3VuY2VzIHdoZW4gdGhlIHRhYmxlIGNvbnRlbnQgY2hhbmdlcyBmcm9tIGZpbHRlciAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2FyaWFSZXN1bHRzQ291bnQnKSBwdWJsaWMgYXJpYVJlc3VsdHNDb3VudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIC8qKiBcclxuICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGNvbHVtbiBzdGF0ZVxyXG4gICAqIEBub3RlIElmIGNvbHVtbnMgYXJlIHJlLWRlZmluZWQgKG9uQ2hhbmdlcyksIHRoaXMgc3RhdGUgd2lsbCBiZSBhcHBsaWVkXHJcbiAgKi9cclxuICBwcml2YXRlIGN1cnJlbnRDb2x1bW5TdGF0ZTogQXBwbHlDb2x1bW5TdGF0ZVBhcmFtcztcclxuXHJcbiAgLyoqIENvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJhYmxlICovXHJcbiAgcHVibGljIGNvbEZpbHRlcnM6IEFycmF5PFNvZlRhYmxlRmlsdGVyPiA9IFtdO1xyXG5cclxuICAvKiogUm93IEhlaWdodCBmb3IgdGFibGUgKi9cclxuICBwdWJsaWMgcm93SGVpZ2h0OiBudW1iZXIgPSA0ODtcclxuXHJcbiAgLyoqIEN1cnJlbnQgUGFnZSBJbmRleCAqL1xyXG4gIHB1YmxpYyBjdXJyZW50UGFnZTogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIEdyaWQgQVBJICovXHJcbiAgcHJpdmF0ZSBncmlkQXBpITogR3JpZEFwaTtcclxuXHJcbiAgLyoqIElzIHRoZSB0YWJsZSByZWFkeSB0byBiZSBkaXNwbGF5ZWQgKi9cclxuICBwdWJsaWMgaXNHcmlkRGF0YVJlbmRlcmVkOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gIC8qKiBEZWZhdWx0IFBhZ2UgU2l6ZSAqL1xyXG4gIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemU6IG51bWJlciA9IDIwOyBcclxuXHJcbiAgLyoqIFRvb2wgdGlwIHNob3cgZGVsYXkgKi9cclxuICBwdWJsaWMgdG9vbHRpcFNob3dEZWxheTogbnVtYmVyID0gNTAwO1xyXG4gIFxyXG4gIC8qKiBOdW1iZXIgb2YgZmlsdGVycyB1c2VkICovXHJcbiAgcHVibGljIGZpbHRlckNvdW50OiBudW1iZXIgPSAwO1xyXG4gIC8qKiBcclxuICAgKiBEZWZhdWx0IENvbHVtbiBEZWZpbml0aW9uIFxyXG4gICAqIEBub3RlIChzdXBwcmVzc0tleWJvYXJkRXZlbnQpIFRhYmxlIGNlbGxzIGNhbiBiZSBuYXZpZ2F0ZWQgd2l0aCB0aGUgYXJyb3cga2V5cywgXHJcbiAgICogaWYgdGhlIGNlbGwgY29udGFpbnMgYSBidXR0b24geW91IGNhbiBUYWIgaW50byB0aGUgYnV0dG9uLCBlbnRlciB8IHNwYWNlIHRvIGludGVyYWN0LlxyXG4gICovXHJcbiAgcHVibGljIGRlZmF1bHRDb2xEZWY6IENvbERlZiA9IHtcclxuICAgIHJlc2l6YWJsZTogZmFsc2UsIC8vIGRpc2FibGUgcmVzaXplIFxyXG4gICAgc3VwcHJlc3NIZWFkZXJNZW51QnV0dG9uOiB0cnVlLCAvLyBkaXNhYmxlIGRlZmF1bHQgZmlsdGVyIG1lbnUgXHJcbiAgICBzdXBwcmVzc01vdmFibGU6IHRydWUsIC8vIGRpc2FibGUgZGVmYXVsdCBkcmFnICYgZHJvcCBmb3IgY29sdW1ucyBcclxuICAgIGNlbGxTdHlsZTogeyBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIiB9LFxyXG4gICAgc3VwcHJlc3NLZXlib2FyZEV2ZW50OiAocGFyYW1zOiBTdXBwcmVzc0tleWJvYXJkRXZlbnRQYXJhbXMpID0+IHtcclxuICAgICAgcmV0dXJuIHBhcmFtcy5ldmVudC5rZXkgPT09ICdUYWInID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8qKiBMZW5ndGggb2YgZGF0YSAqL1xyXG4gIHB1YmxpYyB0b3RhbExlbmd0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqVG90YWwgbnVtYmVyIG9mIHBhZ2VzICovXHJcbiAgcHVibGljIHRvdGFsTnVtYmVyT2ZQYWdlczogbnVtYmVyO1xyXG5cclxuICAvKiogUGFnZSBDaGFuZ2UgdGV4dCAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlVGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogUGFnZSBzZWxlY3RvciBhcnJheSAqL1xyXG4gIHB1YmxpYyBwYWdlU2VsZWN0b3I6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgLyoqIEZpbHRlciBQYW5lbCBvcGVuIHN0YXRlICovXHJcbiAgcHVibGljIGZpbHRlck9wZW5TdGF0ZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFRoZSBsaXN0IG9mIGZpbHRlcnMgYW5kIHRoZSBzZWxlY3RlZCB2YWx1ZXMgKi9cclxuICBwdWJsaWMgZmlsdGVyU2VsZWN0aW9uczogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuXHJcbiAgLyoqIG1hdC1kaWFsb2cgKi9cclxuICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XHJcblxyXG4gIC8qKiBUcmFuc2xhdGlvbiBzZXJ2aWNlICovXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xyXG5cclxuICAvKiogT24gY29tcG9uZW50IGluaXQgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuZ3VsYXIgT24gQ2hhbmdlc1xyXG4gICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBpbnB1dCBjaGFuZ2VzXHJcbiAgICovXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnJvd0RhdGEgJiYgIWNoYW5nZXMucm93RGF0YS5maXJzdENoYW5nZSAmJiAhIXRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5yb3dEYXRhLmxlbmd0aDtcclxuICAgICAgdGhpcy5wb3B1bGF0ZUZpbHRlcnMoKTtcclxuICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gICAgICB0aGlzLmlzR3JpZERhdGFSZW5kZXJlZC5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5jb2xEZWZzICYmICFjaGFuZ2VzLmNvbERlZnMuZmlyc3RDaGFuZ2UgJiYgISF0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLmFwcGx5Q29sdW1uU3RhdGUodGhpcy5jdXJyZW50Q29sdW1uU3RhdGUpO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVGaWx0ZXJzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdyaWQgaGFzIGluZ2VzdGVkIHRoZSBpbnB1dCBkYXRhXHJcbiAgICogQHBhcmFtIHBhcmFtcyBHcmlkIFJlYWR5IEV2ZW50LFxyXG4gICAqIFRoZSBncmlkIGhhcyBpbml0aWFsaXplZCBhbmQgaXMgcmVhZHkgZm9yIG1vc3QgYXBpIGNhbGxzLCBidXQgbWF5IG5vdCBiZSBmdWxseSByZW5kZXJlZCB5ZXQuXHJcbiAgICogQG5vdGUgeW91IGNhbiBub3QgYWNjZXNzIHRoaXMuZ3JpZEFwaSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBydW4sIFxyXG4gICAqIGFueSBhdHRlbXB0cyB0byBhY2Nlc3MgdGhpcy5ncmlkQXBpIGluIHRoaXMgY29tcG9uZW50cyBuZ09uSW5pdCBvciB0aGUgZmlyc3QgbmdPbkNoYW5nZXMgY3ljbGVcclxuICAgKiB3aWxsIHJlc3VsdCBpbiBhIHR5cGUgZXJyb3I7IGJlaW5nIHRoaXMuZ3JpZEFwaSBpcyB1bmRlZmluZWQgYXQgdGhhdCB0aW1lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkdyaWRSZWFkeShwYXJhbXM6IEdyaWRSZWFkeUV2ZW50KSB7XHJcbiAgICB0aGlzLmdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRSb3dDb3VudCgpO1xyXG4gICAgd2luZG93Lm9ucmVzaXplID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2JpbGVXaWR0aFRocmVzaG9sZCA9IDc1MjtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IG1vYmlsZVdpZHRoVGhyZXNob2xkKSB7XHJcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0MDtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9IDEwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzaXplR3JpZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBGaXJlZCB0aGUgZmlyc3QgdGltZSBkYXRhIGlzIHJlbmRlcmVkIGludG8gdGhlIGdyaWQuICovXHJcbiAgcHVibGljIG9uRmlyc3REYXRhUmVuZGVyZWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2F2ZWRDb2x1bW5TdGF0ZT8uc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4gPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5ncmlkQXBpLmdldENvbHVtblN0YXRlKCkpO1xyXG4gICAgICB0aGlzLnNhdmVkQ29sdW1uU3RhdGUgPSB7XHJcbiAgICAgICAgc3RhdGU6IGNvbHVtblN0YXRlLFxyXG4gICAgICAgIGFwcGx5T3JkZXI6IHRydWVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZEFwaS5hcHBseUNvbHVtblN0YXRlKHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZWRDb2x1bW5TdGF0ZS5lbWl0KHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW5TdGF0ZSA9IHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZTtcclxuICAgIHRoaXMucG9wdWxhdGVGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB0aGlzLmlzR3JpZERhdGFSZW5kZXJlZC5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzaXplIGdyaWQgZnJvbSBzaXplIG1vZGUgKi9cclxuICBwcml2YXRlIHJlc2l6ZUdyaWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zaXplTW9kZSA9PT0gJ0NvbXBhY3QnKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNpemVNb2RlID09PSAnUm9vbXknKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNTY7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0ODtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHBhZ2Ugc2VsZWN0aW9uIGNoYW5nZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc2VsZWN0ZWQgcGFnZSBudW1iZXJcclxuICAgKi9cclxuICBwdWJsaWMgb25QYWdlTnVtYmVyQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIFRoZSBwYWdlIHZhbHVlcyBhcmUgMSBvZmYgdG8gbWFrZSBhIDEtYmFzZWQgYXJyYXksIGJ1dCB0aGUgYWN0dWFsIHBhZ2VzIGFyZSBhIDAtYmFzZWQgYXJyYXkuXHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QYWdlKHZhbHVlIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogT24gbmV4dCBwYWdlIGV2ZW50ICovXHJcbiAgcHVibGljIG5leHRQYWdlKCkge1xyXG4gICAgdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25Hb1RvTmV4dFBhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKiogT24gUHJldmlvdXMgUGFnZSBFdmVudCAqL1xyXG4gIHB1YmxpYyBwcmV2aW91c1BhZ2UoKSB7XHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QcmV2aW91c1BhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBDaGFuZ2UgUGFnZSBTaXplIEV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBwYWdpbmF0aW9uIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhZ2VTaXplKGV2ZW50OiBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50KSB7XHJcbiAgICAvLyBPbmx5IG5lZWQgdG8gZG8gdGhpcyB3b3JrIGlmIHRoZSBwYWdlIHNpemUgaGFzIGNoYW5nZWQuXHJcbiAgICBpZiAoZXZlbnQubmV3UGFnZVNpemUpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsdGVyZWQgcm93cy5cclxuICAgICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgICAgLy8gSGFuZGxlIHRleHQgY2hhbmdlc1xyXG4gICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdyaWQgZmlsdGVyIGlzIGNoYW5nZWQgXHJcbiAgICogQHRvZG8gdXBkYXRlIHRoZSBmaWx0ZXIgZHJvcGRvd24gb3B0aW9ucyBiYXNlZCBvbiB0aGUgZmlsdGVyZWQgZGF0YSBzZXQsIGluc3RlYWQgb2YgdGhlIGNvbXBsZXRlIGRhdGEgc2V0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkZpbHRlckNoYW5nZWQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwcmV2aW91c1RvdGFsTGVuZ3RoOiBudW1iZXIgPSBOdW1iZXIodGhpcy50b3RhbExlbmd0aCk7XHJcbiAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBmaWx0ZXJlZCByb3dzLlxyXG4gICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgIGlmICh0aGlzLnRvdGFsTGVuZ3RoICE9PSBwcmV2aW91c1RvdGFsTGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYXJpYVJlc3VsdHNDb3VudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgIHRoaXMuYXJpYVJlc3VsdHNDb3VudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMudG90YWxMZW5ndGggPT09IDBcclxuICAgICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5maWx0ZXJlZC1yZXN1bHRzLm5vLXJlc3VsdHMnKVxyXG4gICAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXHJcbiAgICAgICAgICAnYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuZmlsdGVyZWQtcmVzdWx0cy5oYXMtcmVzdWx0cycsIHsncmVzdWx0c0NvdW50JzogdGhpcy50b3RhbExlbmd0aH1cclxuICAgICAgICApO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFyaWFSZXN1bHRzQ291bnQubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdlbmVyYXRlZCB0ZXh0IGZvciBzaG93aW5nIHBhZ2VzIGluIGZvcm1hdDogMS0xMSBvZiAxMSAqL1xyXG4gIHByaXZhdGUgaGFuZGxlUGFnZUNoYW5nZVRleHQoKTogdm9pZCB7XHJcbiAgICAvLyBIYW5kbGUgZW1wdHkgdGFibGVcclxuICAgIGlmICghdGhpcy50b3RhbExlbmd0aCB8fCB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9PT0gMCkge1xyXG4gICAgICAvLyBSZXNldCB0aGUgcGFnaW5hdGlvbiBVSVxyXG4gICAgICB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNlbGVjdG9yID0gWzFdO1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2VUZXh0ID0gYDBgO1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2hvd05vUm93c092ZXJsYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICB9XHJcbiAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xyXG4gICAgdGhpcy50b3RhbE51bWJlck9mUGFnZXMgPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFRvdGFsUGFnZXMoKSB8fCBNYXRoLmNlaWwodGhpcy50b3RhbExlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKSB8fCAxO1xyXG4gICAgLy8gUmVzZXQgdGhlIHBhZ2Ugc2VsZWN0b3JcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgY29uc3QgcGFnZVNlbGVjdG9yID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlczsgaSsrKSB7XHJcbiAgICAgIHBhZ2VTZWxlY3Rvci5wdXNoKGkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYWdlU2VsZWN0b3IgPSBwYWdlU2VsZWN0b3I7XHJcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh0aGlzLnRvdGFsTGVuZ3RoLCAwKTtcclxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpICogcGFnZVNpemU7XHJcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggPCBsZW5ndGggPyBNYXRoLm1pbihzdGFydEluZGV4ICsgcGFnZVNpemUsIGxlbmd0aCkgOiBzdGFydEluZGV4ICsgcGFnZVNpemU7XHJcbiAgICB0aGlzLnBhZ2VDaGFuZ2VUZXh0ID0gYCR7c3RhcnRJbmRleCArIDF9IC0gJHtlbmRJbmRleH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGhlIHNlYXJjaCBmaWx0ZXIgb24gZGF0YSB3aGVuIHNlYXJjaCB0ZXh0IGNoYW5nZWRcclxuICAgKi9cclxuICBwdWJsaWMgb25TZWFyY2hUZXh0Q2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRHcmlkT3B0aW9uKFwicXVpY2tGaWx0ZXJUZXh0XCIsIHRoaXMuZ3JpZFNlYXJjaFRleHRJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb2dnbGUgdGhlIGZpbHRlciBwYW5lbCBkaXNwbGF5ICovXHJcbiAgcHVibGljIHRvZ2dsZUZpbHRlclBhbmVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJPcGVuU3RhdGUgPSAhdGhpcy5maWx0ZXJPcGVuU3RhdGU7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbHkgdGhlIHNlbGVjdGVkIGZpbHRlcnMgKi9cclxuICBwdWJsaWMgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgbGV0IHRhYmxlRmlsdGVyTW9kZWw6IEZpbHRlck1vZGVsID0ge307XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sRmlsdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb2xGaWx0ZXIgPSB0aGlzLmNvbEZpbHRlcnNbaV07XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLmZpbHRlclNlbGVjdGlvbnNbaV07XHJcbiAgICAgIGlmICghc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyBSZXNldCBvdXQgdGhlIGNvbHVtbiBmaWx0ZXJzXHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLnNldENvbHVtbkZpbHRlck1vZGVsKGNvbEZpbHRlci5oZWFkZXIsIG51bGwpO1xyXG4gICAgICAgIHRhYmxlRmlsdGVyTW9kZWxbY29sRmlsdGVyLmhlYWRlcl0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAvLyBTZXQgdGhlIHNpbmdsZSBmaWx0ZXIgZm9yIHRoZSBjb2x1bW5cclxuICAgICAgICBsZXQgZmlsdGVyTW9kZWw6IFRleHRGaWx0ZXJNb2RlbCA9IHsgZmlsdGVyVHlwZTogJ3RleHQnLCB0eXBlOiAnZXF1YWxzJywgZmlsdGVyOiBzZWxlY3RlZEVsZW1lbnRzWzBdIH07XHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIGZpbHRlciBtb2RlbCB0byB0aGUgY29sdW1uXHJcbiAgICAgICAgdGFibGVGaWx0ZXJNb2RlbFtjb2xGaWx0ZXIuaGVhZGVyXSA9IGZpbHRlck1vZGVsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFNldCBtdWx0aXBsZSBPUiBmaWx0ZXJzIGZvciB0aGUgY29sdW1uXHJcbiAgICAgICAgbGV0IGZpbHRlck1vZGVsczogQ29tYmluZWRTaW1wbGVNb2RlbDxUZXh0RmlsdGVyTW9kZWw+ID0geyBmaWx0ZXJUeXBlOiAndGV4dCcsIG9wZXJhdG9yOiAnT1InLCBjb25kaXRpb25zOiBbXSB9O1xyXG4gICAgICAgIC8vIFNldCB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdGhlIG1vZGVsXHJcbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RlZEVsZW1lbnQgb2Ygc2VsZWN0ZWRFbGVtZW50cykge1xyXG4gICAgICAgICAgZmlsdGVyTW9kZWxzLmNvbmRpdGlvbnMucHVzaCh7IGZpbHRlclR5cGU6ICd0ZXh0JywgdHlwZTogJ2VxdWFscycsIGZpbHRlcjogc2VsZWN0ZWRFbGVtZW50IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIG1vZGVsIGNvbGxlY3Rpb24gdG8gdGhlIGNvbHVtblxyXG4gICAgICAgIHRhYmxlRmlsdGVyTW9kZWxbY29sRmlsdGVyLmhlYWRlcl0gPSBmaWx0ZXJNb2RlbHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE9uY2UgZXZlcnl0aGluZyBpcyBzZXQsIHVwZGF0ZSB0aGUgZmlsdGVyc1xyXG4gICAgdGhpcy5maWx0ZXJDb3VudCA9IHRoaXMuZ2V0RmlsdGVyQ291bnQoKTtcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRGaWx0ZXJNb2RlbCh0YWJsZUZpbHRlck1vZGVsKTtcclxuICAgIHRoaXMuZ3JpZEFwaS5vbkZpbHRlckNoYW5nZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciBhbGwgZmlsdGVycyAqL1xyXG4gIHB1YmxpYyBjbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBDbGVhciBhbGwgc2VsZWN0aW9uc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlclNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zW2ldID0gW107XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgdGhlIGZ1bGwgZ3JpZCBmaWx0ZXIgbW9kZWwgdG8gbnVsbFxyXG4gICAgdGhpcy5ncmlkQXBpLnNldEZpbHRlck1vZGVsKG51bGwpO1xyXG4gICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0aGlzLmdyaWRBcGkub25GaWx0ZXJDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgbm8gZmlsdGVycyBhcmUgc2VsZWN0ZWRcclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGEgZmlsdGVyIGlzIHNlbGVjdGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGhhc0VtcHR5RmlsdGVycygpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJTZWxlY3Rpb25zIHx8ICF0aGlzLmZpbHRlclNlbGVjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBmaWx0ZXJTZWxlY3Qgb2YgdGhpcy5maWx0ZXJTZWxlY3Rpb25zKSB7XHJcbiAgICAgIC8vIElmIGF0IGxlYXN0IG9uZSBmaWx0ZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIHJldHVybiBmYWxzZVxyXG4gICAgICBpZiAoZmlsdGVyU2VsZWN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogQ2FuY2VsIHRoZSBjaGFuZ2VzIHRvIHRoZSBmaWx0ZXIgYW5kIGNsb3NlcyB0aGUgZmlsdGVyIHBhbmVsICovXHJcbiAgcHVibGljIGNhbmNlbEZpbHRlckNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICAvL1NldHMgdGhlIGZpbHRlciBzZWxlY3Rpb25zIG9uIGZpbHRlciBwYW5lbFxyXG4gICAgdGhpcy5zZXRGaWx0ZXJTZWxlY3Rpb25zKCk7XHJcbiAgICAvLyBDbG9zZSB0aGUgZmlsdGVyIHBhbmVsXHJcbiAgICB0aGlzLnRvZ2dsZUZpbHRlclBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICAvKiogUG9wdWxhdGVzIHRoZSBmaWx0ZXIgZHJvcGRvd25zICovXHJcbiAgcHJpdmF0ZSBwb3B1bGF0ZUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBSZXNldCB0aGUgZmlsdGVyIGRyb3Bkb3duc1xyXG4gICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zID0gW107XHJcbiAgICB0aGlzLmNvbEZpbHRlcnMgPSBbXTtcclxuICAgIC8vIEdldCB0aGUgY29sdW1uIGRlZmluaXRpb25zIHRoYXQgaGF2ZSBhIGZpbHRlclxyXG4gICAgY29uc3QgZmlsdGVyZWRDb2xzOiBBcnJheTxDb2xEZWY+ID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkRlZnMoKS5maWx0ZXIoKGRlZikgPT4gZGVmWydmaWx0ZXInXSk7XHJcbiAgICAvLyBDcmVhdGUgYSBtYXAgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcyBmb3IgZWFjaCBmaWVsZFxyXG4gICAgY29uc3QgZmlsdGVyVmFsdWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFNldDxhbnk+PigpO1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXRzIGZvciBlYWNoIGZpZWxkIChjb2x1bW4pIFxyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgZmlsdGVyZWRDb2xzKSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkOiBzdHJpbmcgPSBjb2xbXCJmaWVsZFwiXTtcclxuICAgICAgZmlsdGVyVmFsdWVzTWFwLnNldChmaWVsZCwgbmV3IFNldDxhbnk+KCkpO1xyXG4gICAgfVxyXG4gICAgLy8gVXNlIGZvckVhY2hOb2RlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgcm93c1xyXG4gICAgdGhpcy5ncmlkQXBpLmZvckVhY2hOb2RlKChub2RlOiBJUm93Tm9kZSkgPT4ge1xyXG4gICAgICBpZiAobm9kZS5kYXRhKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZmlsdGVyZWRDb2xzKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gY29sW1wiZmllbGRcIl07XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZTogYW55ID0gdGhpcy5ncmlkQXBpLmdldENlbGxWYWx1ZSh7cm93Tm9kZTogbm9kZSwgY29sS2V5OiBmaWVsZH0pO1xyXG4gICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGZpbHRlclZhbHVlc01hcC5nZXQoZmllbGQpPy5hZGQodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciBlYWNoIGZpZWxkLCBwb3B1bGF0ZSBmaWx0ZXIgb3B0aW9uc1xyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgZmlsdGVyZWRDb2xzKSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkOiBzdHJpbmcgPSBjb2xbXCJmaWVsZFwiXTtcclxuICAgICAgY29uc3QgbGFiZWw6IHN0cmluZyA9IGNvbFtcImhlYWRlck5hbWVcIl07XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVZhbHVlczogQXJyYXk8YW55PiA9IEFycmF5LmZyb20oZmlsdGVyVmFsdWVzTWFwLmdldChmaWVsZCkgfHwgW10pLnNvcnQoKTtcclxuICAgICAgaWYgKHVuaXF1ZVZhbHVlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlJ3Mgc3BhY2UgZm9yIGZpbHRlciBzZWxlY3Rpb25zXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zLnB1c2goW10pOyBcclxuICAgICAgICB0aGlzLmNvbEZpbHRlcnMucHVzaCh7IGhlYWRlcjogZmllbGQsIGxhYmVsOiBsYWJlbCwgb3B0aW9uczogdW5pcXVlVmFsdWVzIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWRBcGkuc2V0RmlsdGVyTW9kZWwodGhpcy5pbml0aWFsRmlsdGVyTW9kZWwpO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJTZWxlY3Rpb25zKCk7XHJcbiAgICB0aGlzLmZpbHRlckNvdW50ID0gdGhpcy5nZXRGaWx0ZXJDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW4gdGhlIGNvbHVtbiBvcHRpb25zIG1vZGFsICovXHJcbiAgcHVibGljIG9wZW5Db2x1bW5PcHRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29sdW1uU3RhdGU6IEFycmF5PENvbHVtblN0YXRlPiA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5TdGF0ZSgpO1xyXG4gICAgY29uc3QgY29sdW1uRGF0YTogQXJyYXk8Q29sdW1uRGF0YT4gPSB0aGlzLmNvbHVtblN0YXRlVG9EYXRhKGNvbHVtblN0YXRlKTtcclxuICAgIGNvbnN0IGluaXRpYWxDb2x1bW5EYXRhOiBBcnJheTxDb2x1bW5EYXRhPiA9IHRoaXMuY29sdW1uU3RhdGVUb0RhdGEodGhpcy5zYXZlZENvbHVtblN0YXRlLnN0YXRlKTtcclxuICAgIGNvbnN0IGNvbHVtbk9wdGlvbnNEYXRhOiBDb2x1bW5PcHRpb25zRGF0YSA9IHtcclxuICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgY29sdW1uRGF0YSxcclxuICAgICAgaW5pdGlhbENvbHVtbkRhdGEsXHJcbiAgICAgIHNob3dTYXZlQ29sdW1uT3B0aW9uc1RleHQ6IHRoaXMuc2hvd1NhdmVDb2x1bW5PcHRpb25zVGV4dFxyXG4gICAgfTtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudCwge1xyXG4gICAgICB3aWR0aDogJzUwMHB4JyxcclxuICAgICAgcG9zaXRpb246IHsgYm90dG9tOiAnNDBweCcsIHJpZ2h0OiAnNDBweCcgfSxcclxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdjb2x1bW4tb3B0aW9ucy1oZWFkaW5nJyxcclxuICAgICAgZGF0YTogY29sdW1uT3B0aW9uc0RhdGFcclxuICAgIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgdGFwKCh1cGRhdGVkQ29sdW1uU3RhdGU6IEFwcGx5Q29sdW1uU3RhdGVQYXJhbXMpID0+IHtcclxuICAgICAgICBpZiAodXBkYXRlZENvbHVtblN0YXRlICYmIHVwZGF0ZWRDb2x1bW5TdGF0ZS5zdGF0ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZEFwaS5hcHBseUNvbHVtblN0YXRlKHVwZGF0ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZWRDb2x1bW5TdGF0ZS5lbWl0KHVwZGF0ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5TdGF0ZSA9IHVwZGF0ZWRDb2x1bW5TdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwcyBgQXJyYXk8Q29sdW1uU3RhdGU+YCB0byBgQXJyYXk8Q29sdW1uRGF0YT5gIFxyXG4gICAqIEBub3RlIGZpbHRlcnMgb3V0IGFueSBjb2x1bW5zIG1hcmtlZCBhcyAncGlubmVkJyBieSB0aGUgY29sdW1uIGRlZmluaXRpb25zLlxyXG4gICAqIEBub3RlIGZpbHRlcnMgYW55IGNvbHVtbnMgd2l0aG91dCBhICdoZWFkZXJOYW1lJy5cclxuICAgKiBAcGFyYW0gY29sdW1uU3RhdGUgdGhlIGNvbHVtbiBzdGF0ZSB0byBtb2RpZnlcclxuICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBjb2x1bW4gZGF0YSBmb3JtYXR0ZWQgdG8gYmUgaW5nZXN0ZWQgYnkgdGhlIGBTb2ZDb2x1bW5PcHRpb25zQ29tcG9uZW50YFxyXG4gICovXHJcbiAgcHJpdmF0ZSBjb2x1bW5TdGF0ZVRvRGF0YShjb2x1bW5TdGF0ZTogQXJyYXk8Q29sdW1uU3RhdGU+KTogQXJyYXk8Q29sdW1uRGF0YT4ge1xyXG4gICAgcmV0dXJuIGNvbHVtblN0YXRlXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWU6IHN0cmluZyA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWYoY29sdW1uLmNvbElkKT8uaGVhZGVyTmFtZSB8fCBcIlwiO1xyXG4gICAgICAgIGlmIChoZWFkZXJOYW1lICYmIGhlYWRlck5hbWUubGVuZ3RoICYmICFjb2x1bW4ucGlubmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLm1hcCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZTogc3RyaW5nID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkRlZihjb2x1bW4uY29sSWQpLmhlYWRlck5hbWU7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGlkOiBjb2x1bW4uY29sSWQsXHJcbiAgICAgICAgICBpc0NoZWNrZWQ6ICFjb2x1bW4uaGlkZSxcclxuICAgICAgICAgIHRleHQ6IGhlYWRlck5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVtaXQgdGhlIGN1cnJlbnQgZmlsdGVyZWQvc29ydGVkIHJvdyBkYXRhICovXHJcbiAgcHVibGljIGV4cG9ydEZpbHRlcmVkUm93RGF0YSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd0RhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuICAgIGNvbnN0IGNvbHVtbnM6IEFycmF5PENvbHVtbj4gPSB0aGlzLmdyaWRBcGkuZ2V0QWxsRGlzcGxheWVkQ29sdW1ucygpLmZpbHRlcigoY29sKSA9PiBjb2wuZ2V0Q29sRGVmKCkuaGVhZGVyTmFtZSk7XHJcbiAgICBjb25zdCB0YWJsZUhlYWRlcnM6IEFycmF5PEtleVZhbFBhaXI+ID0gW107XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gY29sLmdldENvbERlZigpLmZpZWxkO1xyXG4gICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBjb2wuZ2V0Q29sRGVmKCkuaGVhZGVyTmFtZTtcclxuICAgICAgdGFibGVIZWFkZXJzLnB1c2goe1xyXG4gICAgICAgIGtleTogZmllbGQsXHJcbiAgICAgICAgdmFsdWU6IG5hbWVcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ3JpZEFwaS5mb3JFYWNoTm9kZUFmdGVyRmlsdGVyQW5kU29ydCgobm9kZTogSVJvd05vZGU8YW55PikgPT4ge1xyXG4gICAgICBjb25zdCBub2RlRGF0YTogYW55ID0ge307XHJcbiAgICAgIGNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbElkOiBzdHJpbmcgPSBjb2wuZ2V0Q29sSWQoKTtcclxuICAgICAgICAvLyBVc2UgZ3JpZEFwaSdzIGdldENlbGxWYWx1ZSB0byBnZXQgdGhlIHZhbHVlIHRyYW5zZm9ybWVkIGJ5IHZhbHVlR2V0dGVyXHJcbiAgICAgICAgbm9kZURhdGFbY29sSWRdID0gdGhpcy5ncmlkQXBpLmdldENlbGxWYWx1ZSh7IHJvd05vZGU6IG5vZGUsIGNvbEtleTogY29sSWQgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByb3dEYXRhLnB1c2gobm9kZURhdGEpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBleHBvcnREYXRhOiBFeHBvcnRUYWJsZURhdGEgPSB7XHJcbiAgICAgIHRhYmxlSGVhZGVycyxcclxuICAgICAgcm93RGF0YVxyXG4gICAgfTtcclxuICAgIHRoaXMuZmlsdGVyZWRSb3dEYXRhRm9yRXhwb3J0LmVtaXQoZXhwb3J0RGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2V0cyBmaWx0ZXIgc2VsZWN0aW9ucyBmb3IgZmlsdGVyIHBhbmVsICovXHJcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJTZWxlY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbEZpbHRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgLy8gR2V0IHRoZSBzdG9yZWQgZmlsdGVycyBmb3IgdGhlIGdpdmVuIG1vZGVsXHJcbiAgICAgIGNvbnN0IGNvbEZpbHRlciA9IHRoaXMuY29sRmlsdGVyc1tpXTtcclxuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRmlsdGVyTW9kZWwoY29sRmlsdGVyLmhlYWRlcik7XHJcbiAgICAgIGxldCBmaWx0ZXJTZWxlY3Rpb25EYXRhID0gW107XHJcbiAgICAgIGlmIChtb2RlbCAmJiBtb2RlbFtcImNvbmRpdGlvbnNcIl0pIHtcclxuICAgICAgICAvLyBUaGUgbW9kZWwgaXMgYSBjb21iaW5lZCBtb2RlbCB3aXRoIG11bHRpcGxlIHNlbGVjdGlvbnNcclxuICAgICAgICBjb25zdCBmaWx0ZXJNb2RlbCA9IG1vZGVsIGFzIENvbWJpbmVkU2ltcGxlTW9kZWw8VGV4dEZpbHRlck1vZGVsPjtcclxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZmlsdGVyTW9kZWwuY29uZGl0aW9ucykge1xyXG4gICAgICAgICAgZmlsdGVyU2VsZWN0aW9uRGF0YS5wdXNoKGVsZW1lbnQuZmlsdGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobW9kZWwpIHtcclxuICAgICAgICAvLyBBc3N1bWUgdGhlIG1vZGVsIGlzIGEgc2luZ2xlIFRleHQgRmlsdGVyIE1vZGVsXHJcbiAgICAgICAgbGV0IGZpbHRlclNlbGVjdGlvbjogVGV4dEZpbHRlck1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgZmlsdGVyU2VsZWN0aW9uRGF0YS5wdXNoKGZpbHRlclNlbGVjdGlvbi5maWx0ZXIpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFNldCB0aGUgZmlsdGVyIHNlbGVjdGlvbnNcclxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zW2ldID0gZmlsdGVyU2VsZWN0aW9uRGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBHZXRzIHRoZSBjb3VudCBvZiBjdXJyZW50IGZpbHRlciBzZWxlY3Rpb25zICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VsZWN0aW9ucy5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjLmNvbmNhdChjdXJyKSwgW10pLmxlbmd0aDtcclxuICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBFeHBvcnRUYWJsZURhdGEge1xyXG4gIHRhYmxlSGVhZGVycz86IEFycmF5PEtleVZhbFBhaXI+O1xyXG4gIHJvd0RhdGE/OiBBcnJheTxhbnk+XHJcbn1cclxuXHJcbmludGVyZmFjZSBLZXlWYWxQYWlyIHsgXHJcbiAga2V5Pzogc3RyaW5nO1xyXG4gIHZhbHVlPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogVXNlZCBmb3Igc2V0dGluZyBmaWx0ZXIgdmFsdWVzICovXHJcbmNsYXNzIFNvZlRhYmxlRmlsdGVyIHtcclxuICAvKiogVGhlIGNvbHVtbiBoZWFkZXIgKi9cclxuICBoZWFkZXI6IHN0cmluZztcclxuICAvKiogVGhlIGNvbHVtbiBsYWJlbCBvciB0cmFuc2xhdGlvbiBrZXkgKi9cclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBUaGUgY29sdW1uIGZpbHRlciBvcHRpb25zICovXHJcbiAgb3B0aW9uczogc3RyaW5nW10gPSBbXTtcclxufVxyXG5cclxuLyoqIEEgZmlsdGVyIGNvbWJpbmluZyBtdWx0aXBsZSBjb25kaXRpb25zLCB0YWtlbiBmcm9tIEFnR3JpZCovXHJcbmNsYXNzIENvbWJpbmVkU2ltcGxlTW9kZWw8VD4ge1xyXG4gIC8qKiBUaGUgZmlsdGVyIHR5cGUuIFVzdWFsbHkgJ3RleHQnICovXHJcbiAgZmlsdGVyVHlwZTogc3RyaW5nO1xyXG4gIC8qKiBUaGUgb3BlcmF0b3IuIFVzdWFsbHkgJ09SJyAqL1xyXG4gIG9wZXJhdG9yOiAnQU5EJyB8ICdPUic7XHJcbiAgLyoqIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgRmlsdGVyIE1vZGVsICovXHJcbiAgY29uZGl0aW9uczogVFtdO1xyXG59XHJcbiIsIjxkaXYgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKVwiXHJcbiAgZnhMYXlvdXRHYXA9XCIxNnB4XCIgbS1iLTI0PlxyXG4gIEBpZiAoZW5hYmxlRmlsdGVyICYmIGNvbEZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlRmlsdGVyUGFuZWwoKVwiIFxyXG4gICAgICBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCJcclxuICAgICAgW2NsYXNzLmZpbHRlci1zZWxlY3RlZF09XCJmaWx0ZXJPcGVuU3RhdGVcIiBcclxuICAgICAgW2lkXT1cImZpbHRlckNvdW50ID09PSAwID8gJ2J0bi1lbmFibGUtZmlsdGVyJyA6J2J0bi1lbmFibGUtZmlsdGVyLWhhcy1maWx0ZXJzJ1wiIFxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgIFttYXRCYWRnZV09XCJmaWx0ZXJDb3VudFwiXHJcbiAgICAgIG1hdEJhZGdlUG9zaXRpb249XCJhZnRlclwiXHJcbiAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJmaWx0ZXJDb3VudCA9PT0gMCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgID5cclxuICAgICAgPGkgY2xhc3M9XCJwaCBwaC1ib2xkIHBoLXNsaWRlcnMtaG9yaXpvbnRhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLmZpbHRlcicgfCB0cmFuc2xhdGV9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZiAoZW5hYmxlU2VhcmNoKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJzb2YtZm9ybS1maWVsZCB0YWJsZS1zZWFyY2gtZmllbGQgZGVuc2UtNFwiIGZ4RmxleD1cImF1dG9cIj5cclxuICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1tYWduaWZ5aW5nLWdsYXNzIHNlYXJjaC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJzZWFyY2gtbGFiZWxcIj57eydhcm1hdHVyZS5zb2YtdGFibGUuc2VhcmNoJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBcclxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hUZXh0Q2hhbmdlZCgpXCIgXHJcbiAgICAgICAgI2dyaWRTZWFyY2hUZXh0SW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImdyaWRTZWFyY2hUZXh0SW5wdXRcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLnNlYXJjaC1maWx0ZXItZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlXCIvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICB9XHJcbiAgQGlmIChlbmFibGVDb2x1bW5PcHRpb25zKSB7XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICAoY2xpY2spPVwib3BlbkNvbHVtbk9wdGlvbnMoKVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24taWNvbi12MlwiIFxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiIGlkPVwib3Blbi1jb2x1bW4tb3B0aW9uc1wiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLmNvbHVtbi1vcHRpb25zLWJ0bicgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuY29sdW1uLW9wdGlvbnMtYnRuJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcENsYXNzPVwibWRjLXRvb2x0aXBfX3N1cmZhY2UgYmVsb3dcIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLXBhdXNlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZihlbmFibGVFeHBvcnQpIHtcclxuICAgIDxidXR0b24gXHJcbiAgICAgIChjbGljayk9XCJleHBvcnRGaWx0ZXJlZFJvd0RhdGEoKVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24taWNvbi12MlwiIFxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiIGlkPVwiZXhwb3J0LXRhYmxlXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuZXhwb3J0LXRhYmxlJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cIidhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5leHBvcnQtdGFibGUnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwQ2xhc3M9XCJtZGMtdG9vbHRpcF9fc3VyZmFjZSBiZWxvd1wiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtZXhwb3J0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIltzb2YtdGFibGUtcmlnaHQtYnV0dG9uc11cIj48L25nLWNvbnRlbnQ+XHJcbiAgPCEtLSBcclxuICBPbmx5IGluamVjdCA8YnV0dG9uPidzIGluc2lkZSBhbiA8bmctY29udGFpbmVyIHNvZi10YWJsZS1yaWdodC1idXR0b25zPlxyXG4gIC4uLiBcclxuICA8bmctY29udGFpbmVyIHNvZi10YWJsZS1yaWdodC1idXR0b25zPlxyXG4gICAgPGJ1dHRvbiBcclxuICAgICAgKGNsaWNrKT1cImFueUZ1bmN0aW9uKClcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiBcclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIiBhcmlhLWxhYmVsPVwiYW55IGJ1dHRvblwiXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJhbnkgYnV0dG9uXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwQ2xhc3M9XCJtZGMtdG9vbHRpcF9fc3VyZmFjZSBiZWxvd1wiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtYWNvcm5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICAuLi4gXHJcbiAgbm90ZTogbWFrZSBzdXJlIGJ1dHRvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgdG8gbWF0Y2ggb3RoZXJzID1cclxuICBgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcImBcclxuICAqIHJlbWVtYmVyIHRvIGFkZCBhcmlhLWxhYmVsIGFuZCB0b29sdGlwIGZvciBpY29uIGJ1dHRvblxyXG4gIC0tPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgI2FyaWFSZXN1bHRzQ291bnQgY2xhc3M9XCJzci1vbmx5XCIgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+PC9kaXY+XHJcblxyXG5AaWYgKGlzR3JpZERhdGFSZW5kZXJlZCgpICYmIGZpbHRlck9wZW5TdGF0ZSkge1xyXG4gIDxmaWVsZHNldCBcclxuICAgIGNsYXNzPVwiZmlsdGVyLXBhbmVsXCIgcm9sZT1cInJlZ2lvblwiXHJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5zZWxlY3QtZmlsdGVycy1kZXNjcmlwdGlvbicgfCB0cmFuc2xhdGVcIj5cclxuICAgIDxwPlxyXG4gICAgICA8aSBjbGFzcz1cInBoIHBoLWJvbGQgcGgtc2xpZGVycy1ob3Jpem9udGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cIm0tbC04XCI+e3snYXJtYXR1cmUuc29mLXRhYmxlLmZpbHRlcicgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgIDwvcD5cclxuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItcGFuZWwtc2VsZWN0LWNvbnRhaW5lciBtLXYtMjBcIj5cclxuICAgICAgQGZvciAoY29sRmlsdGVyIG9mIGNvbEZpbHRlcnM7IGxldCBpID0gJGluZGV4OyB0cmFjayBpKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJzb2YtZm9ybS1maWVsZCB0YWJsZS1maWx0ZXItc2VsZWN0XCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7Y29sRmlsdGVyLmxhYmVsfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclNlbGVjdGlvbnNbaV1cIiBcclxuICAgICAgICAgICAgbXVsdGlwbGUgXHJcbiAgICAgICAgICAgIGlkPVwiZmlsdGVyRHJvcGRvd257e2l9fVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3snYXJtYXR1cmUuc29mLXRhYmxlLmFsbCcgfCB0cmFuc2xhdGV9fVwiIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKGNvbE9wdGlvbiBvZiBjb2xGaWx0ZXIub3B0aW9uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImNvbE9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAge3tjb2xPcHRpb259fVxyXG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjUwJVwiPlxyXG4gICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIiBbZGlzYWJsZWRdPVwiaGFzRW1wdHlGaWx0ZXJzKClcIiBcclxuICAgICAgICAgIG1hdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCIgc2l6ZT1cIm1lZGl1bVwiXHJcbiAgICAgICAgICBpZD1cInRhYmxlRmlsdGVyQ2xlYXJcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XHJcbiAgICAgICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUucmVzZXQnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiNTAlXCI+XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMiVcIiBmeExheW91dEFsaWduPVwiZmxleC1lbmRcIj5cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiMCAxIGF1dG9cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsRmlsdGVyQ2hhbmdlcygpXCIgbWF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24tdjJcIiBcclxuICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCIgaWQ9XCJ0YWJsZUZpbHRlckNhbmNlbFwiIGNvbG9yPVwidGVydGlhcnlcIj5cclxuICAgICAgICAgICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUuY2FuY2VsJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjAgMSBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cIm1lZGl1bVwiIGlkPVwidGFibGVGaWx0ZXJBcHBseVwiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgIHt7J2FybWF0dXJlLnNvZi10YWJsZS5yZXN1bHRzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9maWVsZHNldD5cclxufVxyXG5cclxuPGFnLWdyaWQtYW5ndWxhciBcclxuICBbZnhTaG93XT1cImlzR3JpZERhdGFSZW5kZXJlZCgpXCJcclxuICAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudClcIiBcclxuICAoZmlyc3REYXRhUmVuZGVyZWQpPVwib25GaXJzdERhdGFSZW5kZXJlZCgpXCJcclxuICAoZmlsdGVyQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoKVwiXHJcbiAgKHBhZ2luYXRpb25DaGFuZ2VkKT1cImNoYW5nZVBhZ2VTaXplKCRldmVudClcIiBcclxuICBbcm93RGF0YV09XCJyb3dEYXRhXCIgXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sRGVmc1wiIFxyXG4gIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIiBcclxuICBbcGFnaW5hdGlvbl09XCJ0cnVlXCIgXHJcbiAgW3N1cHByZXNzUGFnaW5hdGlvblBhbmVsXT1cInRydWVcIlxyXG4gIFtwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3Rvcl09XCJwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvclwiIFxyXG4gIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwicGFnaW5hdGlvblBhZ2VTaXplXCJcclxuICBbaGVhZGVySGVpZ2h0XT1cInJvd0hlaWdodFwiIFxyXG4gIFtyb3dIZWlnaHRdPVwicm93SGVpZ2h0XCIgXHJcbiAgW2RvbUxheW91dF09XCInYXV0b0hlaWdodCdcIiBcclxuICBbdG9vbHRpcFNob3dEZWxheV09XCJ0b29sdGlwU2hvd0RlbGF5XCJcclxuICBbb3ZlcmxheU5vUm93c1RlbXBsYXRlXT1cIidhcm1hdHVyZS5zb2YtdGFibGUubm8tcm93cycgfCB0cmFuc2xhdGVcIlxyXG4gIFtjbGFzcy5uby1yb3dzXT1cIiF0b3RhbExlbmd0aFwiXHJcbiAgY2xhc3M9XCJhZy10aGVtZS1tYXRlcmlhbFwiPlxyXG48L2FnLWdyaWQtYW5ndWxhcj5cclxuXHJcbjxkaXYgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKVwiXHJcbiAgY2xhc3M9XCJjdXN0b20tcGFnaW5hdG9yXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZpcnN0LXNlY3Rpb25cIj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tcGFydC0xXCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAjcGFnZVNpemVTZWxlY3RcclxuICAgICAgICBpZD1cInBhZ2VTaXplSW5wdXRcIiBuYW1lPVwicGFnZVNpemVJbnB1dFwiIFxyXG4gICAgICAgIFsodmFsdWUpXT1cInBhZ2luYXRpb25QYWdlU2l6ZVwiIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCI+XHJcbiAgICAgICAgQGZvciAoc2l6ZSBvZiBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFxyXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2Utb3B0aW9uXCIgaWQ9XCJzaXple3tpfX1cIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JbaV1cIj5cclxuICAgICAgICAgICAge3tzaXplfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnJlbnQtcGFnZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7cGFnaW5hdGlvblBhZ2VTaXplfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtaWNvblwiPlxyXG4gICAgICAgICAgICAgIDxpIFtjbGFzc109XCIncGgtYm9sZCBwaC1jYXJldC0nICsgKHBhZ2VTaXplU2VsZWN0LnBhbmVsT3BlbiA/ICd1cCc6J2Rvd24nKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJwYWdlQ2hhbmdlVGV4dFwiPlxyXG4gICAgICB7e3BhZ2VDaGFuZ2VUZXh0fX0ge3snYXJtYXR1cmUuc29mLXRhYmxlLm9mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxMZW5ndGh9fVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJnby10by1wYWdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwib3V0ZXItYm94XCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tcGFydFwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAgICNwYWdlTnVtYmVyU2VsZWN0XHJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uUGFnZU51bWJlckNoYW5nZSgkZXZlbnQudmFsdWUpXCJcclxuICAgICAgICAgIFsodmFsdWUpXT1cImN1cnJlbnRQYWdlXCIgXHJcbiAgICAgICAgICBpZD1cInBhZ2VTZWxlbGN0b3JcIiBuYW1lPVwicGFnZVNlbGVjdG9yXCIgZGlzYWJsZVJpcHBsZT1cInRydWVcIj5cclxuICAgICAgICAgIEBmb3IgKHBhZ2Ugb2YgcGFnZVNlbGVjdG9yOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInBhZ2VcIiBjbGFzcz1cInBhZ2Utb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7cGFnZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7Y3VycmVudFBhZ2V9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib2YtcGFnZVwiPiB7eydhcm1hdHVyZS5zb2YtdGFibGUub2YnIHwgdHJhbnNsYXRlfX0ge3t0b3RhbE51bWJlck9mUGFnZXN9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCIncGgtYm9sZCBwaC1jYXJldC0nICsgKHBhZ2VOdW1iZXJTZWxlY3QucGFuZWxPcGVuID8gJ3VwJzonZG93bicpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmF2IGNsYXNzPVwic2Vjb25kLXNlY3Rpb25cIj5cclxuICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAoY2xpY2spPVwicHJldmlvdXNQYWdlKClcIlxyXG4gICAgICAgIGlkPVwicHJldi1idXR0b25cIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSAxXCIgXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInc2NyZWVuLXJlYWRlci5wYWdpbmF0aW9uLnByZXZpb3VzJyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1jYXJldC1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIFxyXG4gICAgICAgIGlkPVwibmV4dC1idXR0b25cIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSB0b3RhbE51bWJlck9mUGFnZXNcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NjcmVlbi1yZWFkZXIucGFnaW5hdGlvbi5uZXh0JyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1jYXJldC1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L25hdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5AaWYgKCFpc0dyaWREYXRhUmVuZGVyZWQoKSkge1xyXG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRhaW5lclwiPlxyXG4gICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIGNvbG9yPVwicHJpbWFyeVwiIG1vZGU9XCJpbmRldGVybWluYXRlXCIvPlxyXG4gIDwvZGl2PlxyXG59XHJcbiJdfQ==
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL2FnLWdyaWQtY29tcG9uZW50cy9zcmMvc29mLXRhYmxlL3NvZi10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9hZy1ncmlkLWNvbXBvbmVudHMvc3JjL3NvZi10YWJsZS9zb2YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUVOLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUdMLHlCQUF5QixFQUMxQixNQUFNLGtEQUFrRCxDQUFDO0FBZ0IxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELDRDQUE0QztBQU01QyxNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBT0Usc0VBQXNFO1FBQ3RELFlBQU8sR0FBZSxFQUFFLENBQUM7UUFFekMsMkRBQTJEO1FBQzNDLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBSzVDLGtCQUFrQjtRQUNGLCtCQUEwQixHQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlFLG9CQUFvQjtRQUNKLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdDLDBDQUEwQztRQUMxQixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3Qyw0Q0FBNEM7UUFDNUIsd0JBQW1CLEdB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QUw3QixTQUFTOytCQUNFLFdBQVc7OEJBT0wsT0FBTztzQkFBdEIsS0FBSztnQkFHVSxPQUFPO3NCQUF0QixLQUFLO2dCQUdXLFFBQVE7c0JBQXhCLEtBQUs7Z0JBR1UsMEJBQTBCO3NCQUF6QyxLQUFLO2dCQUdVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBR1UsWUFBWTtzQkFBM0IsS0FBSztnQkFHVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBR1UsWUFBWTtzQkFBM0IsS0FBSztnQkFXVSx5QkFBeUI7c0JBQXhDLEtBQUs7Z0JBTVUsU0FBUztzQkFBeEIsS0FBSztnQkFHVyxnQkFBZ0I7c0JBQWhDLEtBQUs7Z0JBR1csa0JBQWtCO3NCQUFsQyxLQUFLO2dCQUdJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFHRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBRzJCLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBR00sZ0JBQWdCO3NCQUFyRCxTQUFTO3VCQUFDLGtCQUFrQjs7QUF1ZS9CLHFDQUFxQztBQUNyQyxNQUFNLGNBQWM7SUFBcEI7UUFLRSxnQ0FBZ0M7UUFDaEMsWUFBTyxHQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQUE7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxtQkFBbUI7Q0FPeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBcclxuICBDb21wb25lbnQsIFxyXG4gIEVsZW1lbnRSZWYsIFxyXG4gIEV2ZW50RW1pdHRlciwgXHJcbiAgaW5qZWN0LCBcclxuICBJbnB1dCwgXHJcbiAgT25DaGFuZ2VzLCBcclxuICBPbkluaXQsIFxyXG4gIE91dHB1dCwgXHJcbiAgc2lnbmFsLCBcclxuICBTaW1wbGVDaGFuZ2VzLCBcclxuICBWaWV3Q2hpbGQsIFxyXG4gIFdyaXRhYmxlU2lnbmFsIFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgdGFrZSwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcblxyXG5pbXBvcnQgeyBcclxuICBDb2x1bW5EYXRhLCBcclxuICBDb2x1bW5PcHRpb25zRGF0YSwgXHJcbiAgU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudCBcclxufSBmcm9tICcuLi9jb2x1bW4tb3B0aW9ucy1tb2RhbC9jb2x1bW4tb3B0aW9ucy5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBcHBseUNvbHVtblN0YXRlUGFyYW1zLFxyXG4gIENvbERlZixcclxuICBDb2x1bW4sXHJcbiAgQ29sdW1uU3RhdGUsXHJcbiAgRmlsdGVyTW9kZWwsXHJcbiAgR3JpZEFwaSxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBJUm93Tm9kZSxcclxuICBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50LFxyXG4gIFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtcyxcclxuICBUZXh0RmlsdGVyTW9kZWxcclxufSBmcm9tIFwiYWctZ3JpZC1jb21tdW5pdHlcIjtcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbi8qKiBUaGUgU29mdGhlb24gQXJtYXR1cmUgVGFibGUgY29tcG9uZW50ICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU29mVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKiBUaGUgbGFuZ3VhZ2UgdGV4dCBvciBhIGtleSB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhpcyBjb21wb25lbnQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcm93RGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAvKiogQ29sdW1uIERlZmluaXRpb25zOiBEZWZpbmVzICYgY29udHJvbHMgZ3JpZCBjb2x1bW5zLiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xEZWZzOiBBcnJheTxDb2xEZWY+ID0gW107XHJcblxyXG4gIC8qKiBTaXplIG1vZGVzIGZvciB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgc2l6ZU1vZGU6ICdDb21wYWN0JyB8ICdSb29teScgfCAnRGVmYXVsdCc7XHJcblxyXG4gIC8qKiBQYWdlcyBzaXplcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjogQXJyYXk8bnVtYmVyPiA9IFsxMCwgMjAsIDUwLCAxMDBdO1xyXG5cclxuICAvKiogRW5hYmxlIHNlYXJjaCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogRW5hYmxlIGN1c3RvbSB0ZXh0IGZpbHRlciBkcm9wZG93bnMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIEVuYWJsZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCBzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlQ29sdW1uT3B0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBFbmFibGUgZXhwb3J0IGJ1dHRvbiB0byBvdXRwdXQgZmlsdGVyZWQgcm93IGRhdGEgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRXhwb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBUbyBkaXNwbGF5IHRoZSB0ZXh0IG9uIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCwgd2hpY2ggc3RhdGVzIC1cclxuICAgKiBgXCJPcHRpb25zIHdpbGwgYmUgc2F2ZWQgZm9yIHRoZSBuZXh0IHRpbWUgeW91IGxvZyBpbi5cImBcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEBkZXNjcmlwdGlvbiBzZXQgdG8gdHJ1ZSBpZiBzZXQtdXAgZm9yIHNhdmluZyBwcmVmZXJlbmNlcyB0byBVc2VyIGRhdGEuXHJcbiAgICogQG5vdGUgWW91IGNhbiBzdGlsbCBzYXZlIHByZWZlcmVuY2VzIHRvIF9sb2NhbF8gb3IgX3Nlc3Npb25fIHN0b3JhZ2VcclxuICAgKiB1c2luZyB0aGUgYHNhdmVkQ29sdW1uU3RhdGVgIGlucHV0LCBhbmQgYHVwZGF0ZWRDb2x1bW5TdGF0ZWAgb3V0cHV0IGV2ZW50LlxyXG4gICAqIEBzZWUgVGhlIERlbW8gc2l0ZSBpcyBzYXZpbmcgdG8gbG9jYWwgc3RvcmFnZS5cclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBOYW1lL2xhYmVsIG9mIHRoZSB0YWJsZSBcclxuICAgKiBAbm90ZSBzaG91bGQgYmUgYSB0cmFuc2xhdGlvbiBrZXlcclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZU5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFVzZXJzIHNhdmVkIGNvbHVtbiBvcHRpb25zIHN0YXRlICovXHJcbiAgQElucHV0KCkgcHJpdmF0ZSBzYXZlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zO1xyXG5cclxuICAvKiogSW5pdGlhbCBmaWx0ZXIgbW9kZWwgKi9cclxuICBASW5wdXQoKSBwcml2YXRlIGluaXRpYWxGaWx0ZXJNb2RlbDogRmlsdGVyTW9kZWw7XHJcblxyXG4gIC8qKiBPdXRwdXQgdXBkYXRlZCBjb2x1bW4gb3B0aW9ucyBldmVudCB0byBzYXZlIHRvIHVzZXIgb3IgYnJvd3NlciBzdG9yYWdlICovXHJcbiAgQE91dHB1dCgpIHVwZGF0ZWRDb2x1bW5TdGF0ZTogRXZlbnRFbWl0dGVyPEFwcGx5Q29sdW1uU3RhdGVQYXJhbXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKiogT3V0cHV0IHVwZGF0ZWQgY29sdW1uIG9wdGlvbnMgZXZlbnQgdG8gc2F2ZSB0byB1c2VyIG9yIGJyb3dzZXIgc3RvcmFnZSAqL1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJlZFJvd0RhdGFGb3JFeHBvcnQ6IEV2ZW50RW1pdHRlcjxFeHBvcnRUYWJsZURhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKiogdGhlIHNlYXJjaCBpbnB1dCAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2dyaWRTZWFyY2hUZXh0SW5wdXQnKSBncmlkU2VhcmNoVGV4dElucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAvKiogVGhlIGhpZGRlbiBlbGVtZW50IHRoYXQgYW5ub3VuY2VzIHdoZW4gdGhlIHRhYmxlIGNvbnRlbnQgY2hhbmdlcyBmcm9tIGZpbHRlciAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2FyaWFSZXN1bHRzQ291bnQnKSBwdWJsaWMgYXJpYVJlc3VsdHNDb3VudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIC8qKiBcclxuICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGNvbHVtbiBzdGF0ZVxyXG4gICAqIEBub3RlIElmIGNvbHVtbnMgYXJlIHJlLWRlZmluZWQgKG9uQ2hhbmdlcyksIHRoaXMgc3RhdGUgd2lsbCBiZSBhcHBsaWVkXHJcbiAgKi9cclxuICBwcml2YXRlIGN1cnJlbnRDb2x1bW5TdGF0ZTogQXBwbHlDb2x1bW5TdGF0ZVBhcmFtcztcclxuXHJcbiAgLyoqIENvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJhYmxlICovXHJcbiAgcHVibGljIGNvbEZpbHRlcnM6IEFycmF5PFNvZlRhYmxlRmlsdGVyPiA9IFtdO1xyXG5cclxuICAvKiogUm93IEhlaWdodCBmb3IgdGFibGUgKi9cclxuICBwdWJsaWMgcm93SGVpZ2h0OiBudW1iZXIgPSA0ODtcclxuXHJcbiAgLyoqIEN1cnJlbnQgUGFnZSBJbmRleCAqL1xyXG4gIHB1YmxpYyBjdXJyZW50UGFnZTogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIEdyaWQgQVBJICovXHJcbiAgcHJpdmF0ZSBncmlkQXBpITogR3JpZEFwaTtcclxuXHJcbiAgLyoqIElzIHRoZSB0YWJsZSByZWFkeSB0byBiZSBkaXNwbGF5ZWQgKi9cclxuICBwdWJsaWMgaXNHcmlkRGF0YVJlbmRlcmVkOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gIC8qKiBEZWZhdWx0IFBhZ2UgU2l6ZSAqL1xyXG4gIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemU6IG51bWJlciA9IDIwOyBcclxuXHJcbiAgLyoqIFRvb2wgdGlwIHNob3cgZGVsYXkgKi9cclxuICBwdWJsaWMgdG9vbHRpcFNob3dEZWxheTogbnVtYmVyID0gNTAwO1xyXG4gIFxyXG4gIC8qKiBOdW1iZXIgb2YgZmlsdGVycyB1c2VkICovXHJcbiAgcHVibGljIGZpbHRlckNvdW50OiBudW1iZXIgPSAwO1xyXG4gIC8qKiBcclxuICAgKiBEZWZhdWx0IENvbHVtbiBEZWZpbml0aW9uIFxyXG4gICAqIEBub3RlIChzdXBwcmVzc0tleWJvYXJkRXZlbnQpIFRhYmxlIGNlbGxzIGNhbiBiZSBuYXZpZ2F0ZWQgd2l0aCB0aGUgYXJyb3cga2V5cywgXHJcbiAgICogaWYgdGhlIGNlbGwgY29udGFpbnMgYSBidXR0b24geW91IGNhbiBUYWIgaW50byB0aGUgYnV0dG9uLCBlbnRlciB8IHNwYWNlIHRvIGludGVyYWN0LlxyXG4gICovXHJcbiAgcHVibGljIGRlZmF1bHRDb2xEZWY6IENvbERlZiA9IHtcclxuICAgIHJlc2l6YWJsZTogZmFsc2UsIC8vIGRpc2FibGUgcmVzaXplIFxyXG4gICAgc3VwcHJlc3NIZWFkZXJNZW51QnV0dG9uOiB0cnVlLCAvLyBkaXNhYmxlIGRlZmF1bHQgZmlsdGVyIG1lbnUgXHJcbiAgICBzdXBwcmVzc01vdmFibGU6IHRydWUsIC8vIGRpc2FibGUgZGVmYXVsdCBkcmFnICYgZHJvcCBmb3IgY29sdW1ucyBcclxuICAgIGNlbGxTdHlsZTogeyBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIiB9LFxyXG4gICAgc3VwcHJlc3NLZXlib2FyZEV2ZW50OiAocGFyYW1zOiBTdXBwcmVzc0tleWJvYXJkRXZlbnRQYXJhbXMpID0+IHtcclxuICAgICAgcmV0dXJuIHBhcmFtcy5ldmVudC5rZXkgPT09ICdUYWInID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8qKiBMZW5ndGggb2YgZGF0YSAqL1xyXG4gIHB1YmxpYyB0b3RhbExlbmd0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqVG90YWwgbnVtYmVyIG9mIHBhZ2VzICovXHJcbiAgcHVibGljIHRvdGFsTnVtYmVyT2ZQYWdlczogbnVtYmVyO1xyXG5cclxuICAvKiogUGFnZSBDaGFuZ2UgdGV4dCAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlVGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogUGFnZSBzZWxlY3RvciBhcnJheSAqL1xyXG4gIHB1YmxpYyBwYWdlU2VsZWN0b3I6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgLyoqIEZpbHRlciBQYW5lbCBvcGVuIHN0YXRlICovXHJcbiAgcHVibGljIGZpbHRlck9wZW5TdGF0ZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFRoZSBsaXN0IG9mIGZpbHRlcnMgYW5kIHRoZSBzZWxlY3RlZCB2YWx1ZXMgKi9cclxuICBwdWJsaWMgZmlsdGVyU2VsZWN0aW9uczogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuXHJcbiAgLyoqIG1hdC1kaWFsb2cgKi9cclxuICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XHJcblxyXG4gIC8qKiBUcmFuc2xhdGlvbiBzZXJ2aWNlICovXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xyXG5cclxuICAvKiogT24gY29tcG9uZW50IGluaXQgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuZ3VsYXIgT24gQ2hhbmdlc1xyXG4gICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBpbnB1dCBjaGFuZ2VzXHJcbiAgICovXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnJvd0RhdGEgJiYgIWNoYW5nZXMucm93RGF0YS5maXJzdENoYW5nZSAmJiAhIXRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5yb3dEYXRhLmxlbmd0aDtcclxuICAgICAgdGhpcy5wb3B1bGF0ZUZpbHRlcnMoKTtcclxuICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gICAgICB0aGlzLmlzR3JpZERhdGFSZW5kZXJlZC5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5jb2xEZWZzICYmICFjaGFuZ2VzLmNvbERlZnMuZmlyc3RDaGFuZ2UgJiYgISF0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLmFwcGx5Q29sdW1uU3RhdGUodGhpcy5jdXJyZW50Q29sdW1uU3RhdGUpO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVGaWx0ZXJzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdyaWQgaGFzIGluZ2VzdGVkIHRoZSBpbnB1dCBkYXRhXHJcbiAgICogQHBhcmFtIHBhcmFtcyBHcmlkIFJlYWR5IEV2ZW50LFxyXG4gICAqIFRoZSBncmlkIGhhcyBpbml0aWFsaXplZCBhbmQgaXMgcmVhZHkgZm9yIG1vc3QgYXBpIGNhbGxzLCBidXQgbWF5IG5vdCBiZSBmdWxseSByZW5kZXJlZCB5ZXQuXHJcbiAgICogQG5vdGUgeW91IGNhbiBub3QgYWNjZXNzIHRoaXMuZ3JpZEFwaSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBydW4sIFxyXG4gICAqIGFueSBhdHRlbXB0cyB0byBhY2Nlc3MgdGhpcy5ncmlkQXBpIGluIHRoaXMgY29tcG9uZW50cyBuZ09uSW5pdCBvciB0aGUgZmlyc3QgbmdPbkNoYW5nZXMgY3ljbGVcclxuICAgKiB3aWxsIHJlc3VsdCBpbiBhIHR5cGUgZXJyb3I7IGJlaW5nIHRoaXMuZ3JpZEFwaSBpcyB1bmRlZmluZWQgYXQgdGhhdCB0aW1lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkdyaWRSZWFkeShwYXJhbXM6IEdyaWRSZWFkeUV2ZW50KSB7XHJcbiAgICB0aGlzLmdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRSb3dDb3VudCgpO1xyXG4gICAgd2luZG93Lm9ucmVzaXplID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2JpbGVXaWR0aFRocmVzaG9sZCA9IDc1MjtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IG1vYmlsZVdpZHRoVGhyZXNob2xkKSB7XHJcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0MDtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9IDEwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzaXplR3JpZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBGaXJlZCB0aGUgZmlyc3QgdGltZSBkYXRhIGlzIHJlbmRlcmVkIGludG8gdGhlIGdyaWQuICovXHJcbiAgcHVibGljIG9uRmlyc3REYXRhUmVuZGVyZWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2F2ZWRDb2x1bW5TdGF0ZT8uc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4gPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5ncmlkQXBpLmdldENvbHVtblN0YXRlKCkpO1xyXG4gICAgICB0aGlzLnNhdmVkQ29sdW1uU3RhdGUgPSB7XHJcbiAgICAgICAgc3RhdGU6IGNvbHVtblN0YXRlLFxyXG4gICAgICAgIGFwcGx5T3JkZXI6IHRydWVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZEFwaS5hcHBseUNvbHVtblN0YXRlKHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZWRDb2x1bW5TdGF0ZS5lbWl0KHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW5TdGF0ZSA9IHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZTtcclxuICAgIHRoaXMucG9wdWxhdGVGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB0aGlzLmlzR3JpZERhdGFSZW5kZXJlZC5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzaXplIGdyaWQgZnJvbSBzaXplIG1vZGUgKi9cclxuICBwcml2YXRlIHJlc2l6ZUdyaWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zaXplTW9kZSA9PT0gJ0NvbXBhY3QnKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNpemVNb2RlID09PSAnUm9vbXknKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNTY7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0ODtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHBhZ2Ugc2VsZWN0aW9uIGNoYW5nZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc2VsZWN0ZWQgcGFnZSBudW1iZXJcclxuICAgKi9cclxuICBwdWJsaWMgb25QYWdlTnVtYmVyQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIFRoZSBwYWdlIHZhbHVlcyBhcmUgMSBvZmYgdG8gbWFrZSBhIDEtYmFzZWQgYXJyYXksIGJ1dCB0aGUgYWN0dWFsIHBhZ2VzIGFyZSBhIDAtYmFzZWQgYXJyYXkuXHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QYWdlKHZhbHVlIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogT24gbmV4dCBwYWdlIGV2ZW50ICovXHJcbiAgcHVibGljIG5leHRQYWdlKCkge1xyXG4gICAgdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25Hb1RvTmV4dFBhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKiogT24gUHJldmlvdXMgUGFnZSBFdmVudCAqL1xyXG4gIHB1YmxpYyBwcmV2aW91c1BhZ2UoKSB7XHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QcmV2aW91c1BhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBDaGFuZ2UgUGFnZSBTaXplIEV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBwYWdpbmF0aW9uIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhZ2VTaXplKGV2ZW50OiBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50KSB7XHJcbiAgICAvLyBPbmx5IG5lZWQgdG8gZG8gdGhpcyB3b3JrIGlmIHRoZSBwYWdlIHNpemUgaGFzIGNoYW5nZWQuXHJcbiAgICBpZiAoZXZlbnQubmV3UGFnZVNpemUpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsdGVyZWQgcm93cy5cclxuICAgICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgICAgLy8gSGFuZGxlIHRleHQgY2hhbmdlc1xyXG4gICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdyaWQgZmlsdGVyIGlzIGNoYW5nZWQgXHJcbiAgICogQHRvZG8gdXBkYXRlIHRoZSBmaWx0ZXIgZHJvcGRvd24gb3B0aW9ucyBiYXNlZCBvbiB0aGUgZmlsdGVyZWQgZGF0YSBzZXQsIGluc3RlYWQgb2YgdGhlIGNvbXBsZXRlIGRhdGEgc2V0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkZpbHRlckNoYW5nZWQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwcmV2aW91c1RvdGFsTGVuZ3RoOiBudW1iZXIgPSBOdW1iZXIodGhpcy50b3RhbExlbmd0aCk7XHJcbiAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBmaWx0ZXJlZCByb3dzLlxyXG4gICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgIGlmICh0aGlzLnRvdGFsTGVuZ3RoICE9PSBwcmV2aW91c1RvdGFsTGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYXJpYVJlc3VsdHNDb3VudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgIHRoaXMuYXJpYVJlc3VsdHNDb3VudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMudG90YWxMZW5ndGggPT09IDBcclxuICAgICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5maWx0ZXJlZC1yZXN1bHRzLm5vLXJlc3VsdHMnKVxyXG4gICAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXHJcbiAgICAgICAgICAnYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuZmlsdGVyZWQtcmVzdWx0cy5oYXMtcmVzdWx0cycsIHsncmVzdWx0c0NvdW50JzogdGhpcy50b3RhbExlbmd0aH1cclxuICAgICAgICApO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFyaWFSZXN1bHRzQ291bnQubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdlbmVyYXRlZCB0ZXh0IGZvciBzaG93aW5nIHBhZ2VzIGluIGZvcm1hdDogMS0xMSBvZiAxMSAqL1xyXG4gIHByaXZhdGUgaGFuZGxlUGFnZUNoYW5nZVRleHQoKTogdm9pZCB7XHJcbiAgICAvLyBIYW5kbGUgZW1wdHkgdGFibGVcclxuICAgIGlmICghdGhpcy50b3RhbExlbmd0aCB8fCB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9PT0gMCkge1xyXG4gICAgICAvLyBSZXNldCB0aGUgcGFnaW5hdGlvbiBVSVxyXG4gICAgICB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNlbGVjdG9yID0gWzFdO1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2VUZXh0ID0gYDBgO1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2hvd05vUm93c092ZXJsYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICB9XHJcbiAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xyXG4gICAgdGhpcy50b3RhbE51bWJlck9mUGFnZXMgPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFRvdGFsUGFnZXMoKSB8fCBNYXRoLmNlaWwodGhpcy50b3RhbExlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKSB8fCAxO1xyXG4gICAgLy8gUmVzZXQgdGhlIHBhZ2Ugc2VsZWN0b3JcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgY29uc3QgcGFnZVNlbGVjdG9yID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlczsgaSsrKSB7XHJcbiAgICAgIHBhZ2VTZWxlY3Rvci5wdXNoKGkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYWdlU2VsZWN0b3IgPSBwYWdlU2VsZWN0b3I7XHJcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh0aGlzLnRvdGFsTGVuZ3RoLCAwKTtcclxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpICogcGFnZVNpemU7XHJcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggPCBsZW5ndGggPyBNYXRoLm1pbihzdGFydEluZGV4ICsgcGFnZVNpemUsIGxlbmd0aCkgOiBzdGFydEluZGV4ICsgcGFnZVNpemU7XHJcbiAgICB0aGlzLnBhZ2VDaGFuZ2VUZXh0ID0gYCR7c3RhcnRJbmRleCArIDF9IC0gJHtlbmRJbmRleH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGhlIHNlYXJjaCBmaWx0ZXIgb24gZGF0YSB3aGVuIHNlYXJjaCB0ZXh0IGNoYW5nZWRcclxuICAgKi9cclxuICBwdWJsaWMgb25TZWFyY2hUZXh0Q2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRHcmlkT3B0aW9uKFwicXVpY2tGaWx0ZXJUZXh0XCIsIHRoaXMuZ3JpZFNlYXJjaFRleHRJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb2dnbGUgdGhlIGZpbHRlciBwYW5lbCBkaXNwbGF5ICovXHJcbiAgcHVibGljIHRvZ2dsZUZpbHRlclBhbmVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJPcGVuU3RhdGUgPSAhdGhpcy5maWx0ZXJPcGVuU3RhdGU7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbHkgdGhlIHNlbGVjdGVkIGZpbHRlcnMgKi9cclxuICBwdWJsaWMgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgbGV0IHRhYmxlRmlsdGVyTW9kZWw6IEZpbHRlck1vZGVsID0ge307XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sRmlsdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb2xGaWx0ZXIgPSB0aGlzLmNvbEZpbHRlcnNbaV07XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLmZpbHRlclNlbGVjdGlvbnNbaV07XHJcbiAgICAgIGlmICghc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyBSZXNldCBvdXQgdGhlIGNvbHVtbiBmaWx0ZXJzXHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLnNldENvbHVtbkZpbHRlck1vZGVsKGNvbEZpbHRlci5oZWFkZXIsIG51bGwpO1xyXG4gICAgICAgIHRhYmxlRmlsdGVyTW9kZWxbY29sRmlsdGVyLmhlYWRlcl0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAvLyBTZXQgdGhlIHNpbmdsZSBmaWx0ZXIgZm9yIHRoZSBjb2x1bW5cclxuICAgICAgICBsZXQgZmlsdGVyTW9kZWw6IFRleHRGaWx0ZXJNb2RlbCA9IHsgZmlsdGVyVHlwZTogJ3RleHQnLCB0eXBlOiAnZXF1YWxzJywgZmlsdGVyOiBzZWxlY3RlZEVsZW1lbnRzWzBdIH07XHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIGZpbHRlciBtb2RlbCB0byB0aGUgY29sdW1uXHJcbiAgICAgICAgdGFibGVGaWx0ZXJNb2RlbFtjb2xGaWx0ZXIuaGVhZGVyXSA9IGZpbHRlck1vZGVsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFNldCBtdWx0aXBsZSBPUiBmaWx0ZXJzIGZvciB0aGUgY29sdW1uXHJcbiAgICAgICAgbGV0IGZpbHRlck1vZGVsczogQ29tYmluZWRTaW1wbGVNb2RlbDxUZXh0RmlsdGVyTW9kZWw+ID0geyBmaWx0ZXJUeXBlOiAndGV4dCcsIG9wZXJhdG9yOiAnT1InLCBjb25kaXRpb25zOiBbXSB9O1xyXG4gICAgICAgIC8vIFNldCB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdGhlIG1vZGVsXHJcbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RlZEVsZW1lbnQgb2Ygc2VsZWN0ZWRFbGVtZW50cykge1xyXG4gICAgICAgICAgZmlsdGVyTW9kZWxzLmNvbmRpdGlvbnMucHVzaCh7IGZpbHRlclR5cGU6ICd0ZXh0JywgdHlwZTogJ2VxdWFscycsIGZpbHRlcjogc2VsZWN0ZWRFbGVtZW50IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIG1vZGVsIGNvbGxlY3Rpb24gdG8gdGhlIGNvbHVtblxyXG4gICAgICAgIHRhYmxlRmlsdGVyTW9kZWxbY29sRmlsdGVyLmhlYWRlcl0gPSBmaWx0ZXJNb2RlbHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE9uY2UgZXZlcnl0aGluZyBpcyBzZXQsIHVwZGF0ZSB0aGUgZmlsdGVyc1xyXG4gICAgdGhpcy5maWx0ZXJDb3VudCA9IHRoaXMuZ2V0RmlsdGVyQ291bnQoKTtcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRGaWx0ZXJNb2RlbCh0YWJsZUZpbHRlck1vZGVsKTtcclxuICAgIHRoaXMuZ3JpZEFwaS5vbkZpbHRlckNoYW5nZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciBhbGwgZmlsdGVycyAqL1xyXG4gIHB1YmxpYyBjbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBDbGVhciBhbGwgc2VsZWN0aW9uc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlclNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zW2ldID0gW107XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgdGhlIGZ1bGwgZ3JpZCBmaWx0ZXIgbW9kZWwgdG8gbnVsbFxyXG4gICAgdGhpcy5ncmlkQXBpLnNldEZpbHRlck1vZGVsKG51bGwpO1xyXG4gICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0aGlzLmdyaWRBcGkub25GaWx0ZXJDaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmZpbHRlckNvdW50ID0gdGhpcy5nZXRGaWx0ZXJDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIG5vIGZpbHRlcnMgYXJlIHNlbGVjdGVkXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhIGZpbHRlciBpcyBzZWxlY3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNFbXB0eUZpbHRlcnMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyU2VsZWN0aW9ucyB8fCAhdGhpcy5maWx0ZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgZmlsdGVyU2VsZWN0IG9mIHRoaXMuZmlsdGVyU2VsZWN0aW9ucykge1xyXG4gICAgICAvLyBJZiBhdCBsZWFzdCBvbmUgZmlsdGVyIGhhcyBiZWVuIHNlbGVjdGVkLCByZXR1cm4gZmFsc2VcclxuICAgICAgaWYgKGZpbHRlclNlbGVjdC5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbmNlbCB0aGUgY2hhbmdlcyB0byB0aGUgZmlsdGVyIGFuZCBjbG9zZXMgdGhlIGZpbHRlciBwYW5lbCAqL1xyXG4gIHB1YmxpYyBjYW5jZWxGaWx0ZXJDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgLy9TZXRzIHRoZSBmaWx0ZXIgc2VsZWN0aW9ucyBvbiBmaWx0ZXIgcGFuZWxcclxuICAgIHRoaXMuc2V0RmlsdGVyU2VsZWN0aW9ucygpO1xyXG4gICAgLy8gQ2xvc2UgdGhlIGZpbHRlciBwYW5lbFxyXG4gICAgdGhpcy50b2dnbGVGaWx0ZXJQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvcHVsYXRlcyB0aGUgZmlsdGVyIGRyb3Bkb3ducyAqL1xyXG4gIHByaXZhdGUgcG9wdWxhdGVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgLy8gUmVzZXQgdGhlIGZpbHRlciBkcm9wZG93bnNcclxuICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5jb2xGaWx0ZXJzID0gW107XHJcbiAgICAvLyBHZXQgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyB0aGF0IGhhdmUgYSBmaWx0ZXJcclxuICAgIGNvbnN0IGZpbHRlcmVkQ29sczogQXJyYXk8Q29sRGVmPiA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWZzKCkuZmlsdGVyKChkZWYpID0+IGRlZlsnZmlsdGVyJ10pO1xyXG4gICAgLy8gQ3JlYXRlIGEgbWFwIHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMgZm9yIGVhY2ggZmllbGRcclxuICAgIGNvbnN0IGZpbHRlclZhbHVlc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8YW55Pj4oKTtcclxuICAgIC8vIEluaXRpYWxpemUgc2V0cyBmb3IgZWFjaCBmaWVsZCAoY29sdW1uKSBcclxuICAgIGZvciAoY29uc3QgY29sIG9mIGZpbHRlcmVkQ29scykge1xyXG4gICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gY29sW1wiZmllbGRcIl07XHJcbiAgICAgIGZpbHRlclZhbHVlc01hcC5zZXQoZmllbGQsIG5ldyBTZXQ8YW55PigpKTtcclxuICAgIH1cclxuICAgIC8vIFVzZSBmb3JFYWNoTm9kZSB0byBpdGVyYXRlIG92ZXIgdGhlIHJvd3NcclxuICAgIHRoaXMuZ3JpZEFwaS5mb3JFYWNoTm9kZSgobm9kZTogSVJvd05vZGUpID0+IHtcclxuICAgICAgaWYgKG5vZGUuZGF0YSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGZpbHRlcmVkQ29scykge1xyXG4gICAgICAgICAgY29uc3QgZmllbGQ6IHN0cmluZyA9IGNvbFtcImZpZWxkXCJdO1xyXG4gICAgICAgICAgY29uc3QgdmFsdWU6IGFueSA9IHRoaXMuZ3JpZEFwaS5nZXRDZWxsVmFsdWUoe3Jvd05vZGU6IG5vZGUsIGNvbEtleTogZmllbGR9KTtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJWYWx1ZXNNYXAuZ2V0KGZpZWxkKT8uYWRkKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgZWFjaCBmaWVsZCwgcG9wdWxhdGUgZmlsdGVyIG9wdGlvbnNcclxuICAgIGZvciAoY29uc3QgY29sIG9mIGZpbHRlcmVkQ29scykge1xyXG4gICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gY29sW1wiZmllbGRcIl07XHJcbiAgICAgIGNvbnN0IGxhYmVsOiBzdHJpbmcgPSBjb2xbXCJoZWFkZXJOYW1lXCJdO1xyXG4gICAgICBjb25zdCB1bmlxdWVWYWx1ZXM6IEFycmF5PGFueT4gPSBBcnJheS5mcm9tKGZpbHRlclZhbHVlc01hcC5nZXQoZmllbGQpIHx8IFtdKS5zb3J0KCk7XHJcbiAgICAgIGlmICh1bmlxdWVWYWx1ZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSdzIHNwYWNlIGZvciBmaWx0ZXIgc2VsZWN0aW9uc1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9ucy5wdXNoKFtdKTsgXHJcbiAgICAgICAgdGhpcy5jb2xGaWx0ZXJzLnB1c2goeyBoZWFkZXI6IGZpZWxkLCBsYWJlbDogbGFiZWwsIG9wdGlvbnM6IHVuaXF1ZVZhbHVlcyB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkQXBpLnNldEZpbHRlck1vZGVsKHRoaXMuaW5pdGlhbEZpbHRlck1vZGVsKTtcclxuICAgIHRoaXMuc2V0RmlsdGVyU2VsZWN0aW9ucygpO1xyXG4gICAgdGhpcy5maWx0ZXJDb3VudCA9IHRoaXMuZ2V0RmlsdGVyQ291bnQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVuIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCAqL1xyXG4gIHB1YmxpYyBvcGVuQ29sdW1uT3B0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4gPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uU3RhdGUoKTtcclxuICAgIGNvbnN0IGNvbHVtbkRhdGE6IEFycmF5PENvbHVtbkRhdGE+ID0gdGhpcy5jb2x1bW5TdGF0ZVRvRGF0YShjb2x1bW5TdGF0ZSk7XHJcbiAgICBjb25zdCBpbml0aWFsQ29sdW1uRGF0YTogQXJyYXk8Q29sdW1uRGF0YT4gPSB0aGlzLmNvbHVtblN0YXRlVG9EYXRhKHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZS5zdGF0ZSk7XHJcbiAgICBjb25zdCBjb2x1bW5PcHRpb25zRGF0YTogQ29sdW1uT3B0aW9uc0RhdGEgPSB7XHJcbiAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXHJcbiAgICAgIGNvbHVtbkRhdGEsXHJcbiAgICAgIGluaXRpYWxDb2x1bW5EYXRhLFxyXG4gICAgICBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiB0aGlzLnNob3dTYXZlQ29sdW1uT3B0aW9uc1RleHRcclxuICAgIH07XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNvZkNvbHVtbk9wdGlvbnNDb21wb25lbnQsIHtcclxuICAgICAgd2lkdGg6ICc1MDBweCcsXHJcbiAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzQwcHgnLCByaWdodDogJzQwcHgnIH0sXHJcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnY29sdW1uLW9wdGlvbnMtaGVhZGluZycsXHJcbiAgICAgIGRhdGE6IGNvbHVtbk9wdGlvbnNEYXRhXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnBpcGUoXHJcbiAgICAgIHRha2UoMSksXHJcbiAgICAgIHRhcCgodXBkYXRlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHVwZGF0ZWRDb2x1bW5TdGF0ZSAmJiB1cGRhdGVkQ29sdW1uU3RhdGUuc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRBcGkuYXBwbHlDb2x1bW5TdGF0ZSh1cGRhdGVkQ29sdW1uU3RhdGUpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVkQ29sdW1uU3RhdGUuZW1pdCh1cGRhdGVkQ29sdW1uU3RhdGUpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uU3RhdGUgPSB1cGRhdGVkQ29sdW1uU3RhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcHMgYEFycmF5PENvbHVtblN0YXRlPmAgdG8gYEFycmF5PENvbHVtbkRhdGE+YCBcclxuICAgKiBAbm90ZSBmaWx0ZXJzIG91dCBhbnkgY29sdW1ucyBtYXJrZWQgYXMgJ3Bpbm5lZCcgYnkgdGhlIGNvbHVtbiBkZWZpbml0aW9ucy5cclxuICAgKiBAbm90ZSBmaWx0ZXJzIGFueSBjb2x1bW5zIHdpdGhvdXQgYSAnaGVhZGVyTmFtZScuXHJcbiAgICogQHBhcmFtIGNvbHVtblN0YXRlIHRoZSBjb2x1bW4gc3RhdGUgdG8gbW9kaWZ5XHJcbiAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgY29sdW1uIGRhdGEgZm9ybWF0dGVkIHRvIGJlIGluZ2VzdGVkIGJ5IHRoZSBgU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudGBcclxuICAqL1xyXG4gIHByaXZhdGUgY29sdW1uU3RhdGVUb0RhdGEoY29sdW1uU3RhdGU6IEFycmF5PENvbHVtblN0YXRlPik6IEFycmF5PENvbHVtbkRhdGE+IHtcclxuICAgIHJldHVybiBjb2x1bW5TdGF0ZVxyXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHtcclxuICAgICAgICBjb25zdCBoZWFkZXJOYW1lOiBzdHJpbmcgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRGVmKGNvbHVtbi5jb2xJZCk/LmhlYWRlck5hbWUgfHwgXCJcIjtcclxuICAgICAgICBpZiAoaGVhZGVyTmFtZSAmJiBoZWFkZXJOYW1lLmxlbmd0aCAmJiAhY29sdW1uLnBpbm5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWU6IHN0cmluZyA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWYoY29sdW1uLmNvbElkKS5oZWFkZXJOYW1lO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBpZDogY29sdW1uLmNvbElkLFxyXG4gICAgICAgICAgaXNDaGVja2VkOiAhY29sdW1uLmhpZGUsXHJcbiAgICAgICAgICB0ZXh0OiBoZWFkZXJOYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBFbWl0IHRoZSBjdXJyZW50IGZpbHRlcmVkL3NvcnRlZCByb3cgZGF0YSAqL1xyXG4gIHB1YmxpYyBleHBvcnRGaWx0ZXJlZFJvd0RhdGEoKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dEYXRhOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBjb25zdCBjb2x1bW5zOiBBcnJheTxDb2x1bW4+ID0gdGhpcy5ncmlkQXBpLmdldEFsbERpc3BsYXllZENvbHVtbnMoKS5maWx0ZXIoKGNvbCkgPT4gY29sLmdldENvbERlZigpLmhlYWRlck5hbWUpO1xyXG4gICAgY29uc3QgdGFibGVIZWFkZXJzOiBBcnJheTxLZXlWYWxQYWlyPiA9IFtdO1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgICAgY29uc3QgZmllbGQ6IHN0cmluZyA9IGNvbC5nZXRDb2xEZWYoKS5maWVsZDtcclxuICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gY29sLmdldENvbERlZigpLmhlYWRlck5hbWU7XHJcbiAgICAgIHRhYmxlSGVhZGVycy5wdXNoKHtcclxuICAgICAgICBrZXk6IGZpZWxkLFxyXG4gICAgICAgIHZhbHVlOiBuYW1lXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdyaWRBcGkuZm9yRWFjaE5vZGVBZnRlckZpbHRlckFuZFNvcnQoKG5vZGU6IElSb3dOb2RlPGFueT4pID0+IHtcclxuICAgICAgY29uc3Qgbm9kZURhdGE6IGFueSA9IHt9O1xyXG4gICAgICBjb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICBjb25zdCBjb2xJZDogc3RyaW5nID0gY29sLmdldENvbElkKCk7XHJcbiAgICAgICAgLy8gVXNlIGdyaWRBcGkncyBnZXRDZWxsVmFsdWUgdG8gZ2V0IHRoZSB2YWx1ZSB0cmFuc2Zvcm1lZCBieSB2YWx1ZUdldHRlclxyXG4gICAgICAgIG5vZGVEYXRhW2NvbElkXSA9IHRoaXMuZ3JpZEFwaS5nZXRDZWxsVmFsdWUoeyByb3dOb2RlOiBub2RlLCBjb2xLZXk6IGNvbElkIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgcm93RGF0YS5wdXNoKG5vZGVEYXRhKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZXhwb3J0RGF0YTogRXhwb3J0VGFibGVEYXRhID0ge1xyXG4gICAgICB0YWJsZUhlYWRlcnMsXHJcbiAgICAgIHJvd0RhdGFcclxuICAgIH07XHJcbiAgICB0aGlzLmZpbHRlcmVkUm93RGF0YUZvckV4cG9ydC5lbWl0KGV4cG9ydERhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNldHMgZmlsdGVyIHNlbGVjdGlvbnMgZm9yIGZpbHRlciBwYW5lbCAqL1xyXG4gIHByaXZhdGUgc2V0RmlsdGVyU2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vIEdldCB0aGUgc3RvcmVkIGZpbHRlcnMgZm9yIHRoZSBnaXZlbiBtb2RlbFxyXG4gICAgICBjb25zdCBjb2xGaWx0ZXIgPSB0aGlzLmNvbEZpbHRlcnNbaV07XHJcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkZpbHRlck1vZGVsKGNvbEZpbHRlci5oZWFkZXIpO1xyXG4gICAgICBsZXQgZmlsdGVyU2VsZWN0aW9uRGF0YSA9IFtdO1xyXG4gICAgICBpZiAobW9kZWwgJiYgbW9kZWxbXCJjb25kaXRpb25zXCJdKSB7XHJcbiAgICAgICAgLy8gVGhlIG1vZGVsIGlzIGEgY29tYmluZWQgbW9kZWwgd2l0aCBtdWx0aXBsZSBzZWxlY3Rpb25zXHJcbiAgICAgICAgY29uc3QgZmlsdGVyTW9kZWwgPSBtb2RlbCBhcyBDb21iaW5lZFNpbXBsZU1vZGVsPFRleHRGaWx0ZXJNb2RlbD47XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZpbHRlck1vZGVsLmNvbmRpdGlvbnMpIHtcclxuICAgICAgICAgIGZpbHRlclNlbGVjdGlvbkRhdGEucHVzaChlbGVtZW50LmZpbHRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG1vZGVsKSB7XHJcbiAgICAgICAgLy8gQXNzdW1lIHRoZSBtb2RlbCBpcyBhIHNpbmdsZSBUZXh0IEZpbHRlciBNb2RlbFxyXG4gICAgICAgIGxldCBmaWx0ZXJTZWxlY3Rpb246IFRleHRGaWx0ZXJNb2RlbCA9IG1vZGVsO1xyXG4gICAgICAgIGZpbHRlclNlbGVjdGlvbkRhdGEucHVzaChmaWx0ZXJTZWxlY3Rpb24uZmlsdGVyKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBTZXQgdGhlIGZpbHRlciBzZWxlY3Rpb25zXHJcbiAgICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9uc1tpXSA9IGZpbHRlclNlbGVjdGlvbkRhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogR2V0cyB0aGUgY291bnQgb2YgY3VycmVudCBmaWx0ZXIgc2VsZWN0aW9ucyAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlclNlbGVjdGlvbnMucmVkdWNlKChhY2MsIGN1cnIpID0+IGFjYy5jb25jYXQoY3VyciksIFtdKS5sZW5ndGg7XHJcbiAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgRXhwb3J0VGFibGVEYXRhIHtcclxuICB0YWJsZUhlYWRlcnM/OiBBcnJheTxLZXlWYWxQYWlyPjtcclxuICByb3dEYXRhPzogQXJyYXk8YW55PlxyXG59XHJcblxyXG5pbnRlcmZhY2UgS2V5VmFsUGFpciB7IFxyXG4gIGtleT86IHN0cmluZztcclxuICB2YWx1ZT86IHN0cmluZztcclxufVxyXG5cclxuLyoqIFVzZWQgZm9yIHNldHRpbmcgZmlsdGVyIHZhbHVlcyAqL1xyXG5jbGFzcyBTb2ZUYWJsZUZpbHRlciB7XHJcbiAgLyoqIFRoZSBjb2x1bW4gaGVhZGVyICovXHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBjb2x1bW4gbGFiZWwgb3IgdHJhbnNsYXRpb24ga2V5ICovXHJcbiAgbGFiZWw6IHN0cmluZztcclxuICAvKiogVGhlIGNvbHVtbiBmaWx0ZXIgb3B0aW9ucyAqL1xyXG4gIG9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbn1cclxuXHJcbi8qKiBBIGZpbHRlciBjb21iaW5pbmcgbXVsdGlwbGUgY29uZGl0aW9ucywgdGFrZW4gZnJvbSBBZ0dyaWQqL1xyXG5jbGFzcyBDb21iaW5lZFNpbXBsZU1vZGVsPFQ+IHtcclxuICAvKiogVGhlIGZpbHRlciB0eXBlLiBVc3VhbGx5ICd0ZXh0JyAqL1xyXG4gIGZpbHRlclR5cGU6IHN0cmluZztcclxuICAvKiogVGhlIG9wZXJhdG9yLiBVc3VhbGx5ICdPUicgKi9cclxuICBvcGVyYXRvcjogJ0FORCcgfCAnT1InO1xyXG4gIC8qKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIEZpbHRlciBNb2RlbCAqL1xyXG4gIGNvbmRpdGlvbnM6IFRbXTtcclxufVxyXG4iLCI8ZGl2IFxyXG4gIFtmeFNob3ddPVwiaXNHcmlkRGF0YVJlbmRlcmVkKClcIlxyXG4gIGZ4TGF5b3V0R2FwPVwiMTZweFwiIG0tYi0yND5cclxuICBAaWYgKGVuYWJsZUZpbHRlciAmJiBjb2xGaWx0ZXJzLmxlbmd0aCkge1xyXG4gICAgPGJ1dHRvbiBcclxuICAgICAgKGNsaWNrKT1cInRvZ2dsZUZpbHRlclBhbmVsKClcIiBcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiXHJcbiAgICAgIFtjbGFzcy5maWx0ZXItc2VsZWN0ZWRdPVwiZmlsdGVyT3BlblN0YXRlXCIgXHJcbiAgICAgIFtpZF09XCJmaWx0ZXJDb3VudCA9PT0gMCA/ICdidG4tZW5hYmxlLWZpbHRlcicgOididG4tZW5hYmxlLWZpbHRlci1oYXMtZmlsdGVycydcIiBcclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIlxyXG4gICAgICBbbWF0QmFkZ2VdPVwiZmlsdGVyQ291bnRcIlxyXG4gICAgICBtYXRCYWRnZVBvc2l0aW9uPVwiYWZ0ZXJcIlxyXG4gICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiZmlsdGVyQ291bnQgPT09IDAgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICA+XHJcbiAgICAgIDxpIGNsYXNzPVwicGggcGgtYm9sZCBwaC1zbGlkZXJzLWhvcml6b250YWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIHt7J2FybWF0dXJlLnNvZi10YWJsZS5maWx0ZXInIHwgdHJhbnNsYXRlfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIH1cclxuICBAaWYgKGVuYWJsZVNlYXJjaCkge1xyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwic29mLWZvcm0tZmllbGQgdGFibGUtc2VhcmNoLWZpZWxkIGRlbnNlLTRcIiBmeEZsZXg9XCJhdXRvXCI+XHJcbiAgICAgIDxzcGFuIG1hdFByZWZpeD5cclxuICAgICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtbWFnbmlmeWluZy1nbGFzcyBzZWFyY2gtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8bWF0LWxhYmVsIGNsYXNzPVwic2VhcmNoLWxhYmVsXCI+e3snYXJtYXR1cmUuc29mLXRhYmxlLnNlYXJjaCcgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgXHJcbiAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoVGV4dENoYW5nZWQoKVwiIFxyXG4gICAgICAgICNncmlkU2VhcmNoVGV4dElucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJncmlkU2VhcmNoVGV4dElucHV0XCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5zZWFyY2gtZmlsdGVyLWRlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZVwiLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgfVxyXG4gIEBpZiAoZW5hYmxlQ29sdW1uT3B0aW9ucykge1xyXG4gICAgPGJ1dHRvbiBcclxuICAgICAgKGNsaWNrKT1cIm9wZW5Db2x1bW5PcHRpb25zKClcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiBcclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIiBpZD1cIm9wZW4tY29sdW1uLW9wdGlvbnNcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5jb2x1bW4tb3B0aW9ucy1idG4nIHwgdHJhbnNsYXRlXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLmNvbHVtbi1vcHRpb25zLWJ0bicgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBDbGFzcz1cIm1kYy10b29sdGlwX19zdXJmYWNlIGJlbG93XCI+XHJcbiAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1wYXVzZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgIDwvYnV0dG9uPlxyXG4gIH1cclxuICBAaWYoZW5hYmxlRXhwb3J0KSB7XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICAoY2xpY2spPVwiZXhwb3J0RmlsdGVyZWRSb3dEYXRhKClcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiBcclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIiBpZD1cImV4cG9ydC10YWJsZVwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLmV4cG9ydC10YWJsZScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuZXhwb3J0LXRhYmxlJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcENsYXNzPVwibWRjLXRvb2x0aXBfX3N1cmZhY2UgYmVsb3dcIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLWV4cG9ydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgIDwvYnV0dG9uPlxyXG4gIH1cclxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbc29mLXRhYmxlLXJpZ2h0LWJ1dHRvbnNdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwhLS0gXHJcbiAgT25seSBpbmplY3QgPGJ1dHRvbj4ncyBpbnNpZGUgYW4gPG5nLWNvbnRhaW5lciBzb2YtdGFibGUtcmlnaHQtYnV0dG9ucz5cclxuICAuLi4gXHJcbiAgPG5nLWNvbnRhaW5lciBzb2YtdGFibGUtcmlnaHQtYnV0dG9ucz5cclxuICAgIDxidXR0b24gXHJcbiAgICAgIChjbGljayk9XCJhbnlGdW5jdGlvbigpXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgXHJcbiAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCIgYXJpYS1sYWJlbD1cImFueSBidXR0b25cIlxyXG4gICAgICBtYXRUb29sdGlwPVwiYW55IGJ1dHRvblwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcENsYXNzPVwibWRjLXRvb2x0aXBfX3N1cmZhY2UgYmVsb3dcIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLWFjb3JuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgLi4uIFxyXG4gIG5vdGU6IG1ha2Ugc3VyZSBidXR0b25zIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHRvIG1hdGNoIG90aGVycyA9XHJcbiAgYG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24taWNvbi12MlwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCJgXHJcbiAgKiByZW1lbWJlciB0byBhZGQgYXJpYS1sYWJlbCBhbmQgdG9vbHRpcCBmb3IgaWNvbiBidXR0b25cclxuICAtLT5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICNhcmlhUmVzdWx0c0NvdW50IGNsYXNzPVwic3Itb25seVwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPjwvZGl2PlxyXG5cclxuQGlmIChpc0dyaWREYXRhUmVuZGVyZWQoKSAmJiBmaWx0ZXJPcGVuU3RhdGUpIHtcclxuICA8ZmllbGRzZXQgXHJcbiAgICBjbGFzcz1cImZpbHRlci1wYW5lbFwiIHJvbGU9XCJyZWdpb25cIlxyXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuc2VsZWN0LWZpbHRlcnMtZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlXCI+XHJcbiAgICA8cD5cclxuICAgICAgPGkgY2xhc3M9XCJwaCBwaC1ib2xkIHBoLXNsaWRlcnMtaG9yaXpvbnRhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtOFwiPnt7J2FybWF0dXJlLnNvZi10YWJsZS5maWx0ZXInIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXBhbmVsLXNlbGVjdC1jb250YWluZXIgbS12LTIwXCI+XHJcbiAgICAgIEBmb3IgKGNvbEZpbHRlciBvZiBjb2xGaWx0ZXJzOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgaSkge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwic29mLWZvcm0tZmllbGQgdGFibGUtZmlsdGVyLXNlbGVjdFwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2NvbEZpbHRlci5sYWJlbH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJTZWxlY3Rpb25zW2ldXCIgXHJcbiAgICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgICBpZD1cImZpbHRlckRyb3Bkb3due3tpfX1cIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J2FybWF0dXJlLnNvZi10YWJsZS5hbGwnIHwgdHJhbnNsYXRlfX1cIiBkaXNhYmxlUmlwcGxlPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICBAZm9yIChjb2xPcHRpb24gb2YgY29sRmlsdGVyLm9wdGlvbnM7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJjb2xPcHRpb25cIj5cclxuICAgICAgICAgICAgICAgIHt7Y29sT3B0aW9ufX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIj5cclxuICAgICAgPGRpdiBmeEZsZXg9XCI1MCVcIj5cclxuICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCIgW2Rpc2FibGVkXT1cImhhc0VtcHR5RmlsdGVycygpXCIgXHJcbiAgICAgICAgICBtYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiIHNpemU9XCJtZWRpdW1cIlxyXG4gICAgICAgICAgaWQ9XCJ0YWJsZUZpbHRlckNsZWFyXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiPlxyXG4gICAgICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLnJlc2V0JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjUwJVwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjIlXCIgZnhMYXlvdXRBbGlnbj1cImZsZXgtZW5kXCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjAgMSBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEZpbHRlckNoYW5nZXMoKVwiIG1hdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCIgXHJcbiAgICAgICAgICAgICAgc2l6ZT1cIm1lZGl1bVwiIGlkPVwidGFibGVGaWx0ZXJDYW5jZWxcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XHJcbiAgICAgICAgICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLmNhbmNlbCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBmeEZsZXg9XCIwIDEgYXV0b1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24tdjJcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIiBpZD1cInRhYmxlRmlsdGVyQXBwbHlcIiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUucmVzdWx0cycgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZmllbGRzZXQ+XHJcbn1cclxuXHJcbjxhZy1ncmlkLWFuZ3VsYXIgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKVwiXHJcbiAgKGdyaWRSZWFkeSk9XCJvbkdyaWRSZWFkeSgkZXZlbnQpXCIgXHJcbiAgKGZpcnN0RGF0YVJlbmRlcmVkKT1cIm9uRmlyc3REYXRhUmVuZGVyZWQoKVwiXHJcbiAgKGZpbHRlckNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKClcIlxyXG4gIChwYWdpbmF0aW9uQ2hhbmdlZCk9XCJjaGFuZ2VQYWdlU2l6ZSgkZXZlbnQpXCIgXHJcbiAgW3Jvd0RhdGFdPVwicm93RGF0YVwiIFxyXG4gIFtjb2x1bW5EZWZzXT1cImNvbERlZnNcIiBcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCIgXHJcbiAgW3BhZ2luYXRpb25dPVwidHJ1ZVwiIFxyXG4gIFtzdXBwcmVzc1BhZ2luYXRpb25QYW5lbF09XCJ0cnVlXCJcclxuICBbcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JcIiBcclxuICBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2luYXRpb25QYWdlU2l6ZVwiXHJcbiAgW2hlYWRlckhlaWdodF09XCJyb3dIZWlnaHRcIiBcclxuICBbcm93SGVpZ2h0XT1cInJvd0hlaWdodFwiIFxyXG4gIFtkb21MYXlvdXRdPVwiJ2F1dG9IZWlnaHQnXCIgXHJcbiAgW3Rvb2x0aXBTaG93RGVsYXldPVwidG9vbHRpcFNob3dEZWxheVwiXHJcbiAgW292ZXJsYXlOb1Jvd3NUZW1wbGF0ZV09XCInYXJtYXR1cmUuc29mLXRhYmxlLm5vLXJvd3MnIHwgdHJhbnNsYXRlXCJcclxuICBbY2xhc3Mubm8tcm93c109XCIhdG90YWxMZW5ndGhcIlxyXG4gIGNsYXNzPVwiYWctdGhlbWUtbWF0ZXJpYWxcIj5cclxuPC9hZy1ncmlkLWFuZ3VsYXI+XHJcblxyXG48ZGl2IFxyXG4gIFtmeFNob3ddPVwiaXNHcmlkRGF0YVJlbmRlcmVkKClcIlxyXG4gIGNsYXNzPVwiY3VzdG9tLXBhZ2luYXRvclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmaXJzdC1zZWN0aW9uXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uLXBhcnQtMVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgPG1hdC1zZWxlY3QgXHJcbiAgICAgICAgI3BhZ2VTaXplU2VsZWN0XHJcbiAgICAgICAgaWQ9XCJwYWdlU2l6ZUlucHV0XCIgbmFtZT1cInBhZ2VTaXplSW5wdXRcIiBcclxuICAgICAgICBbKHZhbHVlKV09XCJwYWdpbmF0aW9uUGFnZVNpemVcIiBkaXNhYmxlUmlwcGxlPVwidHJ1ZVwiPlxyXG4gICAgICAgIEBmb3IgKHNpemUgb2YgcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3I7IGxldCBpID0gJGluZGV4OyB0cmFjayBpKSB7XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBcclxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlLW9wdGlvblwiIGlkPVwic2l6ZXt7aX19XCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yW2ldXCI+XHJcbiAgICAgICAgICAgIHt7c2l6ZX19XHJcbiAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2VcIj57e3BhZ2luYXRpb25QYWdlU2l6ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWljb25cIj5cclxuICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiJ3BoLWJvbGQgcGgtY2FyZXQtJyArIChwYWdlU2l6ZVNlbGVjdC5wYW5lbE9wZW4gPyAndXAnOidkb3duJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxzcGFuIGNsYXNzPVwicGFnZUNoYW5nZVRleHRcIj5cclxuICAgICAge3twYWdlQ2hhbmdlVGV4dH19IHt7J2FybWF0dXJlLnNvZi10YWJsZS5vZicgfCB0cmFuc2xhdGV9fSB7e3RvdGFsTGVuZ3RofX1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZ28tdG8tcGFnZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm91dGVyLWJveFwiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uLXBhcnRcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgXHJcbiAgICAgICAgICAjcGFnZU51bWJlclNlbGVjdFxyXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblBhZ2VOdW1iZXJDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICBbKHZhbHVlKV09XCJjdXJyZW50UGFnZVwiIFxyXG4gICAgICAgICAgaWQ9XCJwYWdlU2VsZWxjdG9yXCIgbmFtZT1cInBhZ2VTZWxlY3RvclwiIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCI+XHJcbiAgICAgICAgICBAZm9yIChwYWdlIG9mIHBhZ2VTZWxlY3RvcjsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJwYWdlXCIgY2xhc3M9XCJwYWdlLW9wdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VycmVudC1wYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2VcIj57e3BhZ2V9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VycmVudC1wYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2VcIj57e2N1cnJlbnRQYWdlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9mLXBhZ2VcIj4ge3snYXJtYXR1cmUuc29mLXRhYmxlLm9mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxOdW1iZXJPZlBhZ2VzfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiJ3BoLWJvbGQgcGgtY2FyZXQtJyArIChwYWdlTnVtYmVyU2VsZWN0LnBhbmVsT3BlbiA/ICd1cCc6J2Rvd24nKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5hdiBjbGFzcz1cInNlY29uZC1zZWN0aW9uXCI+XHJcbiAgICAgIDxidXR0b24gXHJcbiAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzUGFnZSgpXCJcclxuICAgICAgICBpZD1cInByZXYtYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiIFxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NjcmVlbi1yZWFkZXIucGFnaW5hdGlvbi5wcmV2aW91cycgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtY2FyZXQtbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gXHJcbiAgICAgICAgKGNsaWNrKT1cIm5leHRQYWdlKClcIiBcclxuICAgICAgICBpZD1cIm5leHQtYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gdG90YWxOdW1iZXJPZlBhZ2VzXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidzY3JlZW4tcmVhZGVyLnBhZ2luYXRpb24ubmV4dCcgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtY2FyZXQtcmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9uYXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuQGlmICghaXNHcmlkRGF0YVJlbmRlcmVkKCkpIHtcclxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cclxuICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjb2xvcj1cInByaW1hcnlcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiLz5cclxuICA8L2Rpdj5cclxufVxyXG4iXX0=
@@ -351,6 +351,7 @@ class SofTableComponent {
351
351
  this.gridApi.setFilterModel(null);
352
352
  // Update the display
353
353
  this.gridApi.onFilterChanged();
354
+ this.filterCount = this.getFilterCount();
354
355
  }
355
356
  /**
356
357
  * Returns true if no filters are selected
@@ -1 +1 @@
1
- {"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss'\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button color=\"tertiary\" \r\n size=\"small\" class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n color=\"secondary\" size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button color=\"primary\" \r\n size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n Column,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n IRowNode,\r\n PaginationChangedEvent,\r\n SuppressKeyboardEventParams,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss'\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData: Array<any> = [];\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() private sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable column options modal selection */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** Enable export button to output filtered row data */\r\n @Input() public enableExport: boolean = false;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** \r\n * Name/label of the table \r\n * @note should be a translation key\r\n */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() private savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Initial filter model */\r\n @Input() private initialFilterModel: FilterModel;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() filteredRowDataForExport: EventEmitter<ExportTableData> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** The hidden element that announces when the table content changes from filter */\r\n @ViewChild('ariaResultsCount') public ariaResultsCount: ElementRef<HTMLElement>;\r\n\r\n /** \r\n * Keep track of the current column state\r\n * @note If columns are re-defined (onChanges), this state will be applied\r\n */\r\n private currentColumnState: ApplyColumnStateParams;\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n \r\n /** Number of filters used */\r\n public filterCount: number = 0;\r\n /** \r\n * Default Column Definition \r\n * @note (suppressKeyboardEvent) Table cells can be navigated with the arrow keys, \r\n * if the cell contains a button you can Tab into the button, enter | space to interact.\r\n */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" },\r\n suppressKeyboardEvent: (params: SuppressKeyboardEventParams) => {\r\n return params.event.key === 'Tab' ? true : false;\r\n }\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** Translation service */\r\n private translateService: TranslateService = inject(TranslateService);\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData.length;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {\r\n setTimeout(() => {\r\n this.gridApi.applyColumnState(this.currentColumnState);\r\n this.populateFilters();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.currentColumnState = this.savedColumnState;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** \r\n * Called when the grid filter is changed \r\n * @todo update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n */\r\n public onFilterChanged(): void {\r\n const previousTotalLength: number = Number(this.totalLength);\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n if (this.totalLength !== previousTotalLength) {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n this.ariaResultsCount.nativeElement.innerHTML = this.totalLength === 0\r\n ? this.translateService.instant('armature.sof-table.screen-reader.filtered-results.no-results')\r\n : this.translateService.instant(\r\n 'armature.sof-table.screen-reader.filtered-results.has-results', {'resultsCount': this.totalLength}\r\n );\r\n setTimeout(() => {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n }, 100);\r\n }\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n }\r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.filterCount = this.getFilterCount();\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n //Sets the filter selections on filter panel\r\n this.setFilterSelections();\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions that have a filter\r\n const filteredCols: Array<ColDef> = this.gridApi.getColumnDefs().filter((def) => def['filter']);\r\n // Create a map to store unique values for each field\r\n const filterValuesMap = new Map<string, Set<any>>();\r\n // Initialize sets for each field (column) \r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n filterValuesMap.set(field, new Set<any>());\r\n }\r\n // Use forEachNode to iterate over the rows\r\n this.gridApi.forEachNode((node: IRowNode) => {\r\n if (node.data) {\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const value: any = this.gridApi.getCellValue({rowNode: node, colKey: field});\r\n if (value) {\r\n filterValuesMap.get(field)?.add(value);\r\n }\r\n }\r\n }\r\n });\r\n // Now that we have the unique values for each field, populate filter options\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const label: string = col[\"headerName\"];\r\n const uniqueValues: Array<any> = Array.from(filterValuesMap.get(field) || []).sort();\r\n if (uniqueValues.length > 1) {\r\n // Ensure there's space for filter selections\r\n this.filterSelections.push([]); \r\n this.colFilters.push({ header: field, label: label, options: uniqueValues });\r\n }\r\n }\r\n this.gridApi.setFilterModel(this.initialFilterModel);\r\n this.setFilterSelections();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n this.currentColumnState = updatedColumnState;\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n\r\n /** Emit the current filtered/sorted row data */\r\n public exportFilteredRowData(): void {\r\n const rowData: Array<any> = [];\r\n const columns: Array<Column> = this.gridApi.getAllDisplayedColumns().filter((col) => col.getColDef().headerName);\r\n const tableHeaders: Array<KeyValPair> = [];\r\n columns.forEach((col) => {\r\n const field: string = col.getColDef().field;\r\n const name: string = col.getColDef().headerName;\r\n tableHeaders.push({\r\n key: field,\r\n value: name\r\n });\r\n });\r\n this.gridApi.forEachNodeAfterFilterAndSort((node: IRowNode<any>) => {\r\n const nodeData: any = {};\r\n columns.forEach(col => {\r\n const colId: string = col.getColId();\r\n // Use gridApi's getCellValue to get the value transformed by valueGetter\r\n nodeData[colId] = this.gridApi.getCellValue({ rowNode: node, colKey: colId });\r\n });\r\n rowData.push(nodeData);\r\n });\r\n const exportData: ExportTableData = {\r\n tableHeaders,\r\n rowData\r\n };\r\n this.filteredRowDataForExport.emit(exportData);\r\n }\r\n\r\n /** Sets filter selections for filter panel */\r\n private setFilterSelections(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n }\r\n\r\n /** Gets the count of current filter selections */\r\n private getFilterCount(): number {\r\n return this.filterSelections.reduce((acc, curr) => acc.concat(curr), []).length;\r\n }\r\n}\r\n\r\ninterface ExportTableData {\r\n tableHeaders?: Array<KeyValPair>;\r\n rowData?: Array<any>\r\n}\r\n\r\ninterface KeyValPair { \r\n key?: string;\r\n value?: string;\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && colFilters.length) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n [class.filter-selected]=\"filterOpenState\" \r\n [id]=\"filterCount === 0 ? 'btn-enable-filter' :'btn-enable-filter-has-filters'\" \r\n color=\"secondary\" size=\"small\"\r\n [matBadge]=\"filterCount\"\r\n matBadgePosition=\"after\"\r\n [matBadgeHidden]=\"filterCount === 0 ? true : false\"\r\n >\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" \r\n #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.search-filter-description' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n color=\"secondary\" size=\"small\" id=\"open-column-options\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n matTooltipPosition=\"below\" matTooltipClass=\"mdc-tooltip__surface below\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if(enableExport) {\r\n <button \r\n (click)=\"exportFilteredRowData()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n color=\"secondary\" size=\"small\" id=\"export-table\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n matTooltipPosition=\"below\" matTooltipClass=\"mdc-tooltip__surface below\">\r\n <i class=\"ph-bold ph-export\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button \r\n (click)=\"anyFunction()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n color=\"secondary\" size=\"small\" aria-label=\"any button\"\r\n matTooltip=\"any button\" matTooltipPosition=\"below\" matTooltipClass=\"mdc-tooltip__surface below\">\r\n <i class=\"ph-bold ph-acorn\" aria-hidden=\"true\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others =\r\n `mat-flat-button class=\"sof-button-icon-v2\" color=\"secondary\" size=\"small\"`\r\n * remember to add aria-label and tooltip for icon button\r\n -->\r\n</div>\r\n\r\n<div #ariaResultsCount class=\"sr-only\" aria-live=\"assertive\"></div>\r\n\r\n@if (isGridDataRendered() && filterOpenState) {\r\n <fieldset \r\n class=\"filter-panel\" role=\"region\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.select-filters-description' | translate\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-v-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field table-filter-select\">\r\n <mat-label>{{colFilter.label}}</mat-label>\r\n <mat-select \r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-button class=\"sof-button-v2\" size=\"medium\"\r\n id=\"tableFilterClear\" color=\"tertiary\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-button class=\"sof-button-v2\" \r\n size=\"medium\" id=\"tableFilterCancel\" color=\"tertiary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n size=\"medium\" id=\"tableFilterApply\" color=\"primary\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"true\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"'armature.sof-table.no-rows' | translate\"\r\n [class.no-rows]=\"!totalLength\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <button class=\"button-part-1\" type=\"button\">\r\n <mat-select \r\n #pageSizeSelect\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{paginationPageSize}}</span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n <span class=\"pageChangeText\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <div class=\"outer-box\">\r\n <button class=\"button-part\" type=\"button\">\r\n <mat-select \r\n #pageNumberSelect\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{page}}</span>\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{currentPage}}</span>\r\n <span class=\"of-page\"> {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}} </span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n </div>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"sof-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"sof-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n</div>\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss'\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatBadgeModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i13"],"mappings":"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"}
1
+ {"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss'\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button color=\"tertiary\" \r\n size=\"small\" class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n color=\"secondary\" size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button color=\"primary\" \r\n size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n Column,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n IRowNode,\r\n PaginationChangedEvent,\r\n SuppressKeyboardEventParams,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss'\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData: Array<any> = [];\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() private sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable column options modal selection */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** Enable export button to output filtered row data */\r\n @Input() public enableExport: boolean = false;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** \r\n * Name/label of the table \r\n * @note should be a translation key\r\n */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() private savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Initial filter model */\r\n @Input() private initialFilterModel: FilterModel;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() filteredRowDataForExport: EventEmitter<ExportTableData> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** The hidden element that announces when the table content changes from filter */\r\n @ViewChild('ariaResultsCount') public ariaResultsCount: ElementRef<HTMLElement>;\r\n\r\n /** \r\n * Keep track of the current column state\r\n * @note If columns are re-defined (onChanges), this state will be applied\r\n */\r\n private currentColumnState: ApplyColumnStateParams;\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n \r\n /** Number of filters used */\r\n public filterCount: number = 0;\r\n /** \r\n * Default Column Definition \r\n * @note (suppressKeyboardEvent) Table cells can be navigated with the arrow keys, \r\n * if the cell contains a button you can Tab into the button, enter | space to interact.\r\n */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" },\r\n suppressKeyboardEvent: (params: SuppressKeyboardEventParams) => {\r\n return params.event.key === 'Tab' ? true : false;\r\n }\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** Translation service */\r\n private translateService: TranslateService = inject(TranslateService);\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData.length;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {\r\n setTimeout(() => {\r\n this.gridApi.applyColumnState(this.currentColumnState);\r\n this.populateFilters();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.currentColumnState = this.savedColumnState;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** \r\n * Called when the grid filter is changed \r\n * @todo update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n */\r\n public onFilterChanged(): void {\r\n const previousTotalLength: number = Number(this.totalLength);\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n if (this.totalLength !== previousTotalLength) {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n this.ariaResultsCount.nativeElement.innerHTML = this.totalLength === 0\r\n ? this.translateService.instant('armature.sof-table.screen-reader.filtered-results.no-results')\r\n : this.translateService.instant(\r\n 'armature.sof-table.screen-reader.filtered-results.has-results', {'resultsCount': this.totalLength}\r\n );\r\n setTimeout(() => {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n }, 100);\r\n }\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n }\r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.filterCount = this.getFilterCount();\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n //Sets the filter selections on filter panel\r\n this.setFilterSelections();\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions that have a filter\r\n const filteredCols: Array<ColDef> = this.gridApi.getColumnDefs().filter((def) => def['filter']);\r\n // Create a map to store unique values for each field\r\n const filterValuesMap = new Map<string, Set<any>>();\r\n // Initialize sets for each field (column) \r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n filterValuesMap.set(field, new Set<any>());\r\n }\r\n // Use forEachNode to iterate over the rows\r\n this.gridApi.forEachNode((node: IRowNode) => {\r\n if (node.data) {\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const value: any = this.gridApi.getCellValue({rowNode: node, colKey: field});\r\n if (value) {\r\n filterValuesMap.get(field)?.add(value);\r\n }\r\n }\r\n }\r\n });\r\n // Now that we have the unique values for each field, populate filter options\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const label: string = col[\"headerName\"];\r\n const uniqueValues: Array<any> = Array.from(filterValuesMap.get(field) || []).sort();\r\n if (uniqueValues.length > 1) {\r\n // Ensure there's space for filter selections\r\n this.filterSelections.push([]); \r\n this.colFilters.push({ header: field, label: label, options: uniqueValues });\r\n }\r\n }\r\n this.gridApi.setFilterModel(this.initialFilterModel);\r\n this.setFilterSelections();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n this.currentColumnState = updatedColumnState;\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n\r\n /** Emit the current filtered/sorted row data */\r\n public exportFilteredRowData(): void {\r\n const rowData: Array<any> = [];\r\n const columns: Array<Column> = this.gridApi.getAllDisplayedColumns().filter((col) => col.getColDef().headerName);\r\n const tableHeaders: Array<KeyValPair> = [];\r\n columns.forEach((col) => {\r\n const field: string = col.getColDef().field;\r\n const name: string = col.getColDef().headerName;\r\n tableHeaders.push({\r\n key: field,\r\n value: name\r\n });\r\n });\r\n this.gridApi.forEachNodeAfterFilterAndSort((node: IRowNode<any>) => {\r\n const nodeData: any = {};\r\n columns.forEach(col => {\r\n const colId: string = col.getColId();\r\n // Use gridApi's getCellValue to get the value transformed by valueGetter\r\n nodeData[colId] = this.gridApi.getCellValue({ rowNode: node, colKey: colId });\r\n });\r\n rowData.push(nodeData);\r\n });\r\n const exportData: ExportTableData = {\r\n tableHeaders,\r\n rowData\r\n };\r\n this.filteredRowDataForExport.emit(exportData);\r\n }\r\n\r\n /** Sets filter selections for filter panel */\r\n private setFilterSelections(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n }\r\n\r\n /** Gets the count of current filter selections */\r\n private getFilterCount(): number {\r\n return this.filterSelections.reduce((acc, curr) => acc.concat(curr), []).length;\r\n }\r\n}\r\n\r\ninterface ExportTableData {\r\n tableHeaders?: Array<KeyValPair>;\r\n rowData?: Array<any>\r\n}\r\n\r\ninterface KeyValPair { \r\n key?: string;\r\n value?: string;\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && colFilters.length) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n [class.filter-selected]=\"filterOpenState\" \r\n [id]=\"filterCount === 0 ? 'btn-enable-filter' :'btn-enable-filter-has-filters'\" \r\n color=\"secondary\" size=\"small\"\r\n [matBadge]=\"filterCount\"\r\n matBadgePosition=\"after\"\r\n [matBadgeHidden]=\"filterCount === 0 ? true : false\"\r\n >\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" \r\n #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.search-filter-description' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n color=\"secondary\" size=\"small\" id=\"open-column-options\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n matTooltipPosition=\"below\" matTooltipClass=\"mdc-tooltip__surface below\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if(enableExport) {\r\n <button \r\n (click)=\"exportFilteredRowData()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n color=\"secondary\" size=\"small\" id=\"export-table\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n matTooltipPosition=\"below\" matTooltipClass=\"mdc-tooltip__surface below\">\r\n <i class=\"ph-bold ph-export\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button \r\n (click)=\"anyFunction()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n color=\"secondary\" size=\"small\" aria-label=\"any button\"\r\n matTooltip=\"any button\" matTooltipPosition=\"below\" matTooltipClass=\"mdc-tooltip__surface below\">\r\n <i class=\"ph-bold ph-acorn\" aria-hidden=\"true\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others =\r\n `mat-flat-button class=\"sof-button-icon-v2\" color=\"secondary\" size=\"small\"`\r\n * remember to add aria-label and tooltip for icon button\r\n -->\r\n</div>\r\n\r\n<div #ariaResultsCount class=\"sr-only\" aria-live=\"assertive\"></div>\r\n\r\n@if (isGridDataRendered() && filterOpenState) {\r\n <fieldset \r\n class=\"filter-panel\" role=\"region\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.select-filters-description' | translate\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-v-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field table-filter-select\">\r\n <mat-label>{{colFilter.label}}</mat-label>\r\n <mat-select \r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-button class=\"sof-button-v2\" size=\"medium\"\r\n id=\"tableFilterClear\" color=\"tertiary\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-button class=\"sof-button-v2\" \r\n size=\"medium\" id=\"tableFilterCancel\" color=\"tertiary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n size=\"medium\" id=\"tableFilterApply\" color=\"primary\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"true\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"'armature.sof-table.no-rows' | translate\"\r\n [class.no-rows]=\"!totalLength\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <button class=\"button-part-1\" type=\"button\">\r\n <mat-select \r\n #pageSizeSelect\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{paginationPageSize}}</span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n <span class=\"pageChangeText\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <div class=\"outer-box\">\r\n <button class=\"button-part\" type=\"button\">\r\n <mat-select \r\n #pageNumberSelect\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{page}}</span>\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{currentPage}}</span>\r\n <span class=\"of-page\"> {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}} </span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n </div>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"sof-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"sof-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n</div>\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss'\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatBadgeModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i13"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softheon/armature",
3
- "version": "17.16.4",
3
+ "version": "17.16.5",
4
4
  "dependencies": {
5
5
  "tslib": "^2.5.0"
6
6
  },