@one-grid-core/angular 0.5.0 → 0.5.1

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.
@@ -135,6 +135,65 @@ export class OneGridApi {
135
135
  updateRowData(rowData) {
136
136
  this.rebuildRows(rowData, false);
137
137
  }
138
+ /**
139
+ * Apply a batch of row changes without the host rebinding the dataset:
140
+ * append rows (at the root, or under a parent by id on tree data), replace
141
+ * rows by id, drop rows at any depth. Selection and expansion survive —
142
+ * this is `updateRowData` fed from the grid's own current rows, so the
143
+ * host keeps no parallel copy to reconcile.
144
+ *
145
+ * Requires a stable `context.componentParent.getRowId`: rows are matched by
146
+ * id, and without an id function there is nothing to match on — the
147
+ * transaction is refused with a warning rather than half-applied.
148
+ */
149
+ applyTransaction(transaction) {
150
+ if (this._destroyed || !transaction)
151
+ return;
152
+ const sample = transaction.update?.[0] ?? transaction.add?.[0]
153
+ ?? (transaction.remove ?? []).find(entry => typeof entry !== 'string');
154
+ if (sample !== undefined && this.rowService.resolveRowId(sample) === null) {
155
+ console.warn('[one-grid] applyTransaction needs context.componentParent.getRowId — rows are matched by id. Nothing was applied.');
156
+ return;
157
+ }
158
+ const removeIds = new Set((transaction.remove ?? []).map(entry => typeof entry === 'string' ? entry : this.rowService.resolveRowId(entry)));
159
+ const updates = new Map((transaction.update ?? []).map(data => [this.rowService.resolveRowId(data), data]));
160
+ const childrenField = this.treeDataChildrenField;
161
+ // Row grouping folds flat rows itself, so the transaction operates on the
162
+ // leaves and re-groups; a parent target would name a synthetic group row,
163
+ // which is not a place data can live.
164
+ const grouping = this._rowGroupFields.length > 0;
165
+ const addToParentId = grouping ? undefined : transaction.addToParentId;
166
+ if (grouping && transaction.addToParentId) {
167
+ console.warn('[one-grid] applyTransaction: addToParentId is ignored under row grouping — groups are synthetic. Rows were added at the root.');
168
+ }
169
+ // Copy-on-write over the grid's own current rows: the node graph carries
170
+ // the data, so the host's original arrays are never mutated and untouched
171
+ // branches keep their object identity for the node-reuse path.
172
+ const applyTo = (rows) => rows
173
+ .filter(data => !removeIds.has(this.rowService.resolveRowId(data)))
174
+ .map(data => {
175
+ const id = this.rowService.resolveRowId(data);
176
+ let next = updates.get(id) ?? data;
177
+ if (this.treeData && childrenField) {
178
+ const children = next[childrenField];
179
+ const rebuilt = children ? applyTo(children) : undefined;
180
+ const withAdded = id != null && id === addToParentId
181
+ ? [...(rebuilt ?? []), ...(transaction.add ?? [])]
182
+ : rebuilt;
183
+ if (withAdded !== children)
184
+ next = { ...next, [childrenField]: withAdded ?? [] };
185
+ }
186
+ return next;
187
+ });
188
+ const currentRows = grouping
189
+ ? this._rowNodes.filter(node => node.leaf).map(node => node.data)
190
+ : this._rowNodes.filter(node => !node.parent).map(node => node.data);
191
+ let roots = applyTo(currentRows);
192
+ if (transaction.add?.length && !addToParentId) {
193
+ roots = [...roots, ...transaction.add];
194
+ }
195
+ this.rebuildRows(roots, false);
196
+ }
138
197
  /**
139
198
  * The one row-loading path. `setRowData` and `updateRowData` differed only in
140
199
  * whether they cleared the state services first, so everything else — build,
@@ -1182,4 +1241,4 @@ export class OneGridApi {
1182
1241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridApi, decorators: [{
1183
1242
  type: Injectable
1184
1243
  }], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridRowService }, { type: i3.OneGridCellService }, { type: i4.OneGridEventService }, { type: i5.OneGridSelectionService }, { type: i6.OneGridExpansionService }] });
1185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFNakQsTUFBTSxPQUFPLFVBQVU7SUFxQnJCLHdEQUF3RDtJQUN4RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7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R0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxJQUFXLFNBQVM7UUFFbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7K0dBdGxEVSxVQUFVO21IQUFWLFVBQVU7OzRGQUFWLFVBQVU7a0JBRHRCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9tb2RlbHMvb25lLXRyZWUtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDb2x1bW5EZWYsIE9uZUNvbHVtblN0YXRlRW50cnkgfSBmcm9tICcuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gXCIuL29uZS1yb3ctbm9kZS5jbGFzc1wiO1xuaW1wb3J0IHsgT25lR3JpZEluaXRPcHRpb25zLCBPbmVHcmlkVHlwZSwgT25lU29ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lUm93VmFsaWRhdGlvbkVycm9ycywgT25lVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9vbmUtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBPbmVGaWx0ZXJNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1leHBhbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsIE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkUm93U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZVwiO1xuaW1wb3J0IHsgZmlsdGVyVHJlZU5vZGUsIGlzRmlsdGVyQWN0aXZlIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLWZpbHRlci5oZWxwZXJcIjtcbmltcG9ydCB7IGJ1aWxkQ3N2LCBPbmVDc3ZFeHBvcnRPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLWNzdi5oZWxwZXJcIjtcbmltcG9ydCB7IGJ1aWxkR3JvdXBlZFJvd3MsIE9uZUFnZ0NvbHVtbiwgT05FX0dST1VQX0lEX0ZJRUxEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLXJvdy1ncm91cGluZy5oZWxwZXJcIjtcbmltcG9ydCB7IE9uZVJvd0RyYWdTdXBwcmVzc2VkUmVhc29uIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWxcIjtcbmltcG9ydCB7IGdldEZpZWxkVmFsdWUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtY2VsbC5oZWxwZXJcIjtcbmltcG9ydCB7IE9uZUdyaWRDZWxsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IEluamVjdGFibGUsIFR5cGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ2VsbFZhbHVlQ2hhbmdlZEV2ZW50LCBDb2x1bW5DaGFuZ2VkRXZlbnQsIE9uZVBpbm5lZFJvd1NpZGUsIFJvd1NlbGVjdGlvbk1vZGUgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JvdXBDb2x1bW5EZWYgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRBcGk8VCA9IGFueT4ge1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQdWJsaWMgc3RhdGVcbiAgLy9cbiAgLy8gRXhwb3NlZCBhcyBnZXR0ZXJzLCBub3QgZmllbGRzLiBUaGVzZSB3ZXJlIHdyaXRhYmxlLCBzbyBhIGNvbnN1bWVyIGNvdWxkXG4gIC8vIGNvcnJ1cHQgdGhlIGdyaWQgYnkgYXNzaWduaW5nIHRvIHRoZW0g4oCUIHN3YXBwaW5nIGByb3dOb2Rlc2AgZm9yIGFuXG4gIC8vIHVucmVsYXRlZCBhcnJheSwgb3Igc2V0dGluZyBgc29ydE1vZGVsYCB3aXRob3V0IHRoZSByb3dzIGV2ZXIgYmVpbmdcbiAgLy8gcmUtc29ydGVkLiBSZWFkcyBhcmUgdW5jaGFuZ2VkOyBvbmx5IGFzc2lnbm1lbnQgaXMgbm93IGEgY29tcGlsZSBlcnJvci5cbiAgLy9cbiAgLy8gVGhlIGFycmF5LXZhbHVlZCBvbmVzIGFyZSB0eXBlZCBgcmVhZG9ubHkgVFtdYCwgd2hpY2ggc3RvcHMgYHB1c2hgIGFuZFxuICAvLyBgc3BsaWNlYCBhdCBjb21waWxlIHRpbWUgd2l0aG91dCBjb3B5aW5nIG9uIGV2ZXJ5IHJlYWQuIFVzZVxuICAvLyBgZ2V0QWxsUm93Tm9kZXMoKWAgd2hlbiB5b3Ugd2FudCBhIGNvcHkgeW91IG93bi5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRleHQ6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgX3Jvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uTW9kZSA9IG51bGw7XG4gIHByaXZhdGUgX2FwaVR5cGU6IE9uZUdyaWRUeXBlID0gbnVsbDtcbiAgcHJpdmF0ZSBfcm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcml2YXRlIF9zb3J0TW9kZWw6IE9uZVNvcnRNb2RlbDxUPltdID0gW107XG5cbiAgLyoqIFVuaXF1ZSBwZXIgZ3JpZCBpbnN0YW5jZSwgYXNzaWduZWQgZHVyaW5nIGBpbml0YC4gKi9cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8qKiBUaGUgYFtjb250ZXh0XWAgdGhlIGdyaWQgd2FzIGdpdmVuLiAqL1xuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dDtcbiAgfVxuXG4gIC8qKiBTZWxlY3Rpb24gbW9kZSwgY2FwdHVyZWQgZHVyaW5nIGBpbml0YC4gQ2hhbmdpbmcgdGhlIGlucHV0IGxhdGVyIGhhcyBubyBlZmZlY3QuICovXG4gIHB1YmxpYyBnZXQgcm93U2VsZWN0aW9uKCk6IFJvd1NlbGVjdGlvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb247XG4gIH1cblxuICAvKiogV2hpY2ggcm9sZSB0aGlzIGluc3RhbmNlIHBsYXlzOiBzaW1wbGUsIG1hc3RlciwgZGV0YWlsIG9yIHRyZWUuICovXG4gIHB1YmxpYyBnZXQgYXBpVHlwZSgpOiBPbmVHcmlkVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVR5cGU7XG4gIH1cblxuICAvKiogRXZlcnkgbm9kZSB0aGUgZ3JpZCBob2xkcywgaW4gZmxhdHRlbmVkIG9yZGVyLiAqL1xuICBwdWJsaWMgZ2V0IHJvd05vZGVzKCk6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd05vZGVzO1xuICB9XG5cbiAgLyoqIFRoZSBzb3J0IG1vZGVsIGN1cnJlbnRseSBhcHBsaWVkLiBDaGFuZ2UgaXQgd2l0aCBgb25Tb3J0Q2hhbmdlZGAuICovXG4gIHB1YmxpYyBnZXQgc29ydE1vZGVsKCk6IHJlYWRvbmx5IE9uZVNvcnRNb2RlbDxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydE1vZGVsO1xuICB9XG5cblxuICBwcml2YXRlIHJvd0hlaWdodDogbnVtYmVyID0gMjY7XG4gIHByaXZhdGUgaGVhZGVyUm93SGVpZ2h0OiBudW1iZXIgPSAzMjtcbiAgcHJpdmF0ZSBfY3VycmVudEluZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9xdWlja0ZpbHRlclZhbHVlOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIF9hY3RpdmVGaWx0ZXJzOiBPbmVGaWx0ZXJNb2RlbFtdID0gW107XG5cbiAgcHJpdmF0ZSBfdmlzaWJsZVJvd05vZGVzOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGlubmVkUm93Tm9kZXM6IFJlY29yZDxPbmVQaW5uZWRSb3dTaWRlLCBPbmVSb3dOb2RlPFQ+W10+ID0geyB0b3A6IFtdLCBib3R0b206IFtdIH07XG4gIHByaXZhdGUgX29yaWdpbmFsUm93Tm9kZXM6IE1hcDxzdHJpbmcsIE9uZVJvd05vZGU8VD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9ub2RlQ2xlYW51cE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTwoKSA9PiB2b2lkPj4oKTsgLy8gQ2xlYW51cCByZWdpc3RyeSAocHJldmVudHMgbWVtb3J5IGxlYWtzKVxuICBwcml2YXRlIF9kZXN0cm95ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBBZHZhbmNlZCBGZWF0dXJlc1xuICBwcml2YXRlIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdHJlZURhdGFDaGlsZHJlbkZpZWxkOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zOiBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gIHByaXZhdGUgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ/OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFN1cHBsaWVzIGEgbWFzdGVyIHJvdydzIGRldGFpbCByb3dzLiBTZXQgdGhyb3VnaCBgc2V0R2V0RGV0YWlsUm93RGF0YWA7XG4gICAqIHByZXZpb3VzbHkgYSB3cml0YWJsZSBwdWJsaWMgZmllbGQgd2l0aCBhIHNldHRlciBiZXNpZGUgaXQsIHdoaWNoIGxlZnQgdHdvXG4gICAqIHdheXMgdG8gZG8gdGhlIHNhbWUgdGhpbmcgYW5kIG9uZSBvZiB0aGVtIHVuY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgX2dldERldGFpbFJvd0RhdGE6IChwYXJhbXM6IE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb2x1bW5TZXJ2aWNlOiBPZ0NvbHVtblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3dTZXJ2aWNlOiBPbmVHcmlkUm93U2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZXJ2aWNlOiBPbmVHcmlkQ2VsbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlOiBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGV4cGFuc2lvblNlcnZpY2U6IE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIFN0YW5kIHRoZSBncmlkIHVwLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIGZyb20gYG5nT25Jbml0YC5cbiAgICpcbiAgICogVGFrZXMgYSBzaW5nbGUgYE9uZUdyaWRJbml0T3B0aW9uc2AgcmF0aGVyIHRoYW4gdGhlIHRlbiBwb3NpdGlvbmFsXG4gICAqIGFyZ3VtZW50cyBpdCB1c2VkIHRvLCBzbyBhIGNhbGwgc2l0ZSByZWFkcyBhcyB0aGUgY29uZmlndXJhdGlvbiBpdCBpcyBhbmRcbiAgICogYSBuZXcgb3B0aW9uIG5vIGxvbmdlciBtZWFucyBlZGl0aW5nIGV2ZXJ5IGNhbGxlci5cbiAgICpcbiAgICogQGludGVybmFsIEFwcGxpY2F0aW9ucyBvYnRhaW4gYSByZWFkeS1tYWRlIEFQSSBmcm9tIGAob25HcmlkUmVhZHkpYDsgdGhleVxuICAgKiBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBpbml0KG9wdGlvbnM6IE9uZUdyaWRJbml0T3B0aW9uczxUPik6IHZvaWQge1xuXG4gICAgY29uc3Qge1xuICAgICAgZ3JpZFR5cGUsXG4gICAgICBjb2x1bW5EZWZzLFxuICAgICAgZGVmYXVsdENvbHVtbkRlZiA9IHt9LFxuICAgICAgZ3JvdXBDb2x1bW5EZWZzID0gW10sXG4gICAgICBjb250ZXh0ID0gbnVsbCxcbiAgICAgIHJvd1NlbGVjdGlvbiA9IG51bGwsXG4gICAgICBtYXN0ZXJEZXRhaWwgPSBmYWxzZSxcbiAgICAgIGRldGFpbENlbGxSZW5kZXJlclBhcmFtcyA9IG51bGwsXG4gICAgICBkZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IG51bGwsXG4gICAgICB0cmVlRGF0YSA9IGZhbHNlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgdGhpcy5faWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLl9hcGlUeXBlID0gZ3JpZFR5cGU7XG4gICAgdGhpcy5fcm93U2VsZWN0aW9uID0gcm93U2VsZWN0aW9uO1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMubWFzdGVyRGV0YWlsID0gbWFzdGVyRGV0YWlsO1xuICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICAgIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDtcbiAgICB0aGlzLnRyZWVEYXRhID0gdHJlZURhdGE7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2V0U2VsZWN0aW9uTW9kZShyb3dTZWxlY3Rpb24pO1xuXG4gICAgLy8gU3ludGhldGljIGdyb3VwIHJvd3MgY2FycnkgdGhlaXIgb3duIHN0YWJsZSBpZCDigJQgdGhlIHBhdGggb2YgZ3JvdXBcbiAgICAvLyB2YWx1ZXMg4oCUIHdoaWNoIG5vIGhvc3QgZ2V0Um93SWQga25vd3MgaG93IHRvIGRlcml2ZS4gVGhlIHdyYXBwZXIgcmVhZHNcbiAgICAvLyBpdCBmaXJzdCBhbmQgZGVmZXJzIHRvIHRoZSBob3N0J3MgZnVuY3Rpb24gKG9yIHRoZSB1dWlkIGZhbGxiYWNrKSBmb3JcbiAgICAvLyByZWFsIHJvd3MsIHNvIGdyb3VwaW5nIGtlZXBzIGV4cGFuc2lvbiBhY3Jvc3MgcmVidWlsZHMgZXZlbiB3aGVuIHRoZVxuICAgIC8vIGhvc3QgcHJvdmlkZWQgbm8gaWQgZnVuY3Rpb24gYXQgYWxsLlxuICAgIGNvbnN0IGhvc3RHZXRSb3dJZCA9IGNvbnRleHQ/LmNvbXBvbmVudFBhcmVudD8uZ2V0Um93SWQgPz8gbnVsbDtcblxuICAgIHRoaXMucm93U2VydmljZS5zZXRHZXRSb3dJZEZuKChwYXJhbXM6IHsgZGF0YTogYW55OyByb3dJbmRleDogbnVtYmVyIH0pID0+XG4gICAgICBwYXJhbXM/LmRhdGE/LltPTkVfR1JPVVBfSURfRklFTERdID8/IGhvc3RHZXRSb3dJZD8uKHBhcmFtcykgPz8gbnVsbCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5EZWZzLCBjb250ZXh0KTtcbiAgICB0aGlzLmNlbGxTZXJ2aWNlLnNldEdyaWRBcGkodGhpcyk7XG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLmluaXRDb2x1bW5EZWZzKGRlZmF1bHRDb2x1bW5EZWYsIGNvbHVtbkRlZnMsIGdyb3VwQ29sdW1uRGVmcywgY29udGV4dCk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUgYXMgQ29sdW1uQ2hhbmdlZEV2ZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBldmVyeSByb3csIGRpc2NhcmRpbmcgc2VsZWN0aW9uIGFuZCBleHBhbnNpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4gdGhlIHJvd3MgcmVwcmVzZW50IHNvbWV0aGluZyBuZXcuIFRvIHN3YXAgdGhlIGRhdGEgd2hpbGVcbiAgICoga2VlcGluZyB3aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhbmQgb3BlbmVkLCB1c2UgYHVwZGF0ZVJvd0RhdGFgLlxuICAgKi9cbiAgcHVibGljIHNldFJvd0RhdGEocm93RGF0YTogVFtdKSB7XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvd0RhdGEsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZXZlcnkgcm93LCBrZWVwaW5nIHNlbGVjdGlvbiBhbmQgZXhwYW5zaW9uLlxuICAgKlxuICAgKiBTdGF0ZSBpcyBrZXllZCBieSByb3cgaWQsIHNvIHRoaXMgb25seSBwcmVzZXJ2ZXMgYW55dGhpbmcgaWYgdGhlIGdyaWQgaGFzIGFcbiAgICogYGNvbnRleHQuY29tcG9uZW50UGFyZW50LmdldFJvd0lkYCDigJQgb3RoZXJ3aXNlIGVhY2ggcmVidWlsZCBtaW50cyBuZXcgaWRzXG4gICAqIGFuZCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVSb3dEYXRhKHJvd0RhdGE6IFRbXSkge1xuXG4gICAgdGhpcy5yZWJ1aWxkUm93cyhyb3dEYXRhLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZSByb3ctbG9hZGluZyBwYXRoLiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBkaWZmZXJlZCBvbmx5IGluXG4gICAqIHdoZXRoZXIgdGhleSBjbGVhcmVkIHRoZSBzdGF0ZSBzZXJ2aWNlcyBmaXJzdCwgc28gZXZlcnl0aGluZyBlbHNlIOKAlCBidWlsZCxcbiAgICogZmlsdGVyLCBwcnVuZSDigJQgbGl2ZXMgaGVyZSBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkUm93cyhyb3dEYXRhOiBUW10sIHJlc2V0U3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGlmIChyZXNldFN0YXRlKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gUm93IGdyb3VwaW5nIGlzIGEgdHJhbnNmb3JtIG9uIHRoZSB3YXkgaW46IHRoZSBob3N0IGtlZXBzIGhhbmRpbmcgdGhlXG4gICAgLy8gZ3JpZCBmbGF0IHJvd3MsIGFuZCB0aGUgdHJlZSBwaXBlbGluZSBiZWxvdyBzZWVzIHN5bnRoZXRpYyBncm91cCByb3dzXG4gICAgLy8gd2l0aCBjaGlsZHJlbiDigJQgdGhlIHNhbWUgc2hhcGUgdHJlZSBkYXRhIGFycml2ZXMgaW4uXG4gICAgaWYgKHRoaXMuX3Jvd0dyb3VwRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICByb3dEYXRhID0gYnVpbGRHcm91cGVkUm93cyhyb3dEYXRhLCB0aGlzLl9yb3dHcm91cEZpZWxkcywgdGhpcy5fYWdnQ29sdW1ucykgYXMgVFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0aGlzLmJ1aWxkUm93Tm9kZXMocm93RGF0YSwgbnVsbCwgMCwgdmFsaWRSb3dJZHMpO1xuXG4gICAgLy8gUHJ1bmUgQkVGT1JFIHNvcnRpbmcgYW5kIGZpbHRlcmluZzogYm90aCByZWFkIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIGFuZFxuICAgIC8vIHdpdGggdGhlIHBydW5lIGxhc3QsIGEgZGF0YSBzd2FwIHdoaWxlIGEgc29ydCB3YXMgYWN0aXZlIHJlc3VycmVjdGVkXG4gICAgLy8gdGhlIHJlbW92ZWQgcm93cyBpbnRvIGBfcm93Tm9kZXNgIGZvciBvbmUgd2hvbGUgcmVuZGVyIOKAlCB0aGUgb2xkIGFuZFxuICAgIC8vIHRoZSBuZXcgZGF0YXNldCBvbiBzY3JlZW4gdG9nZXRoZXIgdW50aWwgdGhlIG5leHQgcmVidWlsZC5cbiAgICB0aGlzLnBydW5lUmVtb3ZlZE5vZGVzKHZhbGlkUm93SWRzKTtcblxuICAgIC8vIFJlLWFwcGx5IHRoZSBhY3RpdmUgc29ydC4gYGJ1aWxkUm93Tm9kZXNgIHJlYnVpbGRzIHRoZSByb3cgbGlzdCBpbiB0aGVcbiAgICAvLyBvcmRlciB0aGUgZGF0YSBhcnJpdmVkLCBzbyB3aXRob3V0IHRoaXMgYSBkYXRhIHVwZGF0ZSBzaWxlbnRseSByZXR1cm5lZFxuICAgIC8vIHRoZSByb3dzIHRvIHRoYXQgb3JkZXIgd2hpbGUgYHNvcnRNb2RlbGAg4oCUIGFuZCB0aGVyZWZvcmUgdGhlIGhlYWRlcidzXG4gICAgLy8gc29ydCBhcnJvdyDigJQgc3RpbGwgc2FpZCB0aGV5IHdlcmUgc29ydGVkLiBTb3J0aW5nIGJlZm9yZSBmaWx0ZXJpbmdcbiAgICAvLyBiZWNhdXNlIGZpbHRlcmluZyBvbmx5IHNldHMgdmlzaWJpbGl0eSBvbiB3aGF0ZXZlciBvcmRlciB0aGlzIGxlYXZlcy5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA+IDApIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBCdWlsZCBSb3cgTm9kZXMgKE9wdGltaXplZClcbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dOb2RlcyhcbiAgICByb3dEYXRhOiBUW10sXG4gICAgcGFyZW50OiBPbmVSb3dOb2RlPFQ+IHwgbnVsbCA9IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlciA9IDAsXG4gICAgdmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAgIGV4cGFuZGVkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldEV4cGFuZGVkSWRzKCkpLFxuICAgIGNvbGxhcHNlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuZXhwYW5zaW9uU2VydmljZS5nZXRDb2xsYXBzZWRJZHMoKSksXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRJZHMoKSksXG4gICAgdmlzaXRlZERhdGE6IFNldDx1bmtub3duPiA9IG5ldyBTZXQoKVxuICApOiBPbmVSb3dOb2RlW10ge1xuXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFtdO1xuICAgICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXJvd0RhdGE/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIHJvd0RhdGEpIHtcblxuICAgICAgY29uc3Qgcm93SWQgPSB0aGlzLnJvd1NlcnZpY2UuZ2VuZXJhdGVSb3dJZChkYXRhLCB0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICAvLyBBIGN5Y2xlIGluIHRoZSBjaGlsZHJlbiBncmFwaCDigJQgYSByb3cgcmVhY2hhYmxlIGZyb20gaXRzIG93biBzdWJ0cmVlLFxuICAgICAgLy8gdGhlIGNsYXNzaWMgT1JNIGJhY2stcmVmZXJlbmNlIOKAlCB1c2VkIHRvIHJlY3Vyc2UgdW50aWwgdGhlIHN0YWNrIGJsZXcsXG4gICAgICAvLyBmcmVlemluZyB0aGUgYXBwOyBhbmQgd2l0aCBnZW5lcmF0ZWQgcm93IGlkcyBpdCBkaWQgc28gd2hpbGUgbWludGluZ1xuICAgICAgLy8gbm9kZXMgdGhlIHdob2xlIHdheSBkb3duLiBUaGUgc2FtZSBndWFyZCBhbHNvIGRyb3BzIGEgZHVwbGljYXRlIHJvdyBpZFxuICAgICAgLy8gKG9yIHRoZSBzYW1lIHJvdyBvYmplY3QgYXBwZWFyaW5nIHR3aWNlKTogZmlyc3Qgb2NjdXJyZW5jZSB3aW5zLlxuICAgICAgaWYgKHZpc2l0ZWREYXRhLmhhcyhkYXRhKSB8fCB2YWxpZFJvd0lkcy5oYXMocm93SWQpKSB7XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBbb25lLWdyaWRdIGN5Y2xpYyBvciBkdXBsaWNhdGUgcm93IChpZCBcIiR7cm93SWR9XCIpIOKAlCBza2lwcGVkLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMuIFRyZWUgZGF0YSBtdXN0IGJlIGFjeWNsaWMgYW5kIHJvdyBpZHMgdW5pcXVlLmApO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aXNpdGVkRGF0YS5hZGQoZGF0YSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGRhdGEgYXMgYW55KVt0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZF0gfHwgbnVsbDtcblxuICAgICAgbGV0IG5vZGU6IE9uZVJvd05vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIHZhbGlkUm93SWRzLmFkZChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhID0gZGF0YTtcbiAgICAgICAgbm9kZS5zZXRSb3dJbmRleCh0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUgPSBuZXcgT25lUm93Tm9kZTxUPihyb3dJZCwgZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgICAgbm9kZS5sZXZlbCA9IGxldmVsO1xuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgbm9kZS5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5zZXQocm93SWQsIG5vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FeGlzdCA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+PSAwO1xuXG4gICAgICAvLyBDb2VyY2VkLCBiZWNhdXNlIGBjaGlsZHJlbkV4aXN0YCBpcyBgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID49IDBgXG4gICAgICAvLyDigJQgd2hpY2ggaXMgYG51bGxgIGZvciBhIHJvdyB3aXRoIG5vIGNoaWxkcmVuIGZpZWxkLCBub3QgYGZhbHNlYC4gVGhlc2VcbiAgICAgIC8vIGFyZSBkZWNsYXJlZCBgYm9vbGVhbmAsIGFuZCBhc3NpZ25pbmcgbnVsbCBtYWRlIGV2ZXJ5IGNvbnN1bWVyIGNvbXBhcmVcbiAgICAgIC8vIHRydXRoaW5lc3MgaW5zdGVhZCBvZiB0aGUgdmFsdWUuXG4gICAgICBub2RlLmdyb3VwID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyBmYWxzZSA6ICEhY2hpbGRyZW5FeGlzdDtcbiAgICAgIG5vZGUubGVhZiA9IHRoaXMubWFzdGVyRGV0YWlsID8gdHJ1ZSA6ICFub2RlLmdyb3VwO1xuICAgICAgbm9kZS5sZWFmR3JvdXAgPSB0aGlzLm1hc3RlckRldGFpbCA/IGZhbHNlIDogKG5vZGUuZ3JvdXAgJiYgIWNoaWxkcmVuRXhpc3QpO1xuICAgICAgbm9kZS5leHBhbmRhYmxlID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogKG5vZGUuZ3JvdXAgJiYgIW5vZGUubGVhZkdyb3VwKTtcblxuICAgICAgY29uc3QgZGVmYXVsdEV4cGFuZGVkID0gbm9kZS5leHBhbmRhYmxlICYmIChsZXZlbCA8IHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgfHwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9PT0gLTEpO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkSWRzLmhhcyhyb3dJZCkgPyB0cnVlIDogY29sbGFwc2VkSWRzLmhhcyhyb3dJZCkgPyBmYWxzZSA6IGRlZmF1bHRFeHBhbmRlZCk7XG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkSWRzLmhhcyhyb3dJZCkpO1xuICAgICAgbm9kZS5zZXRDZWxsU3RhdGVzKHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGUpKTtcblxuICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsICYmIHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSh7IGRhdGEsIG5vZGU6IG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICB0aGlzLl9yb3dOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy50cmVlRGF0YSAmJiBjaGlsZHJlbkV4aXN0ID8gdGhpcy5idWlsZFJvd05vZGVzKGNoaWxkcmVuIHx8IFtdLCBub2RlLCBsZXZlbCArIDEsIHZhbGlkUm93SWRzLCBleHBhbmRlZElkcywgY29sbGFwc2VkSWRzLCBzZWxlY3RlZElkcywgdmlzaXRlZERhdGEpIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBGZWF0dXJlXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuXG4gICAgY29uc3QgcXVpY2sgPSB0aGlzLl9xdWlja0ZpbHRlclZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuXG4gICAgLy8gVGhlIGZpZWxkcyB0aGUgZ3JpZCBhY3R1YWxseSBzaG93cy4gV2l0aG91dCB0aGVtIHRoZSBxdWljayBmaWx0ZXIgZmFsbHNcbiAgICAvLyBiYWNrIHRvIGV2ZXJ5IHByb3BlcnR5IG9uIHRoZSByb3csIHdoaWNoIGxldHMgYSB1c2VyIG1hdGNoIG9uIGRhdGEgdGhhdFxuICAgIC8vIGhhcyBubyBjb2x1bW4gYW5kIG5ldmVyIGFwcGVhcnMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucXVpY2tGaWx0ZXJGaWVsZHMoKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBmaWx0ZXJUcmVlTm9kZShub2RlLCBmaWx0ZXJzLCBxdWljaywgZmllbGRzKSk7XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCBmaWVsZHMgdGhlIHF1aWNrIGZpbHRlciBzZWFyY2hlczogZXZlcnkgY29sdW1uIHRoYXQgaGFzIG9uZS5cbiAgICpcbiAgICogRW1wdHkgd2hpbGUgdGhlIGNvbHVtbnMgYXJlIHN0aWxsIGJlaW5nIHJlZ2lzdGVyZWQsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqIGhlbHBlciBmYWxscyBiYWNrIHRvIHNlYXJjaGluZyB0aGUgcm93IOKAlCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgYmVmb3JlLCBhbmRcbiAgICogdGhlIG9ubHkgc2Vuc2libGUgYW5zd2VyIHdoZW4gdGhlIGdyaWQgZG9lcyBub3QgeWV0IGtub3cgaXRzIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIHF1aWNrRmlsdGVyRmllbGRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2VcbiAgICAgIC5nZXRDb2x1bW5TdGF0ZSgpXG4gICAgICAuY29sdW1uc1xuICAgICAgLm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkIGFzIHN0cmluZylcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+ICEhZmllbGQgJiYgZmllbGQgIT09ICdfb25lUm93TnVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIFJvdyBOb2RlcyBEaXNwbGF5XG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hWaXNpYmxlTm9kZXMoZGlzcGF0Y2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB2aXNpYmxlTm9kZXM6IE9uZVJvd05vZGVbXSA9IFtdO1xuXG4gICAgbGV0IHJvd051bWJlciA9IDE7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9yb3dOb2Rlcykge1xuXG4gICAgICBjb25zdCBwYXJlbnRWaXNpYmxlID0gbm9kZS5wYXJlbnQgPyB2aXNpYmlsaXR5Q2FjaGUuZ2V0KG5vZGUucGFyZW50LnJvd0lkKSA6IHRydWU7XG5cbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IG5vZGUudmlzaWJsZSAmJiBwYXJlbnRWaXNpYmxlICYmICghbm9kZS5wYXJlbnQgfHwgbm9kZS5wYXJlbnQuZXhwYW5kZWQpO1xuXG4gICAgICB2aXNpYmlsaXR5Q2FjaGUuc2V0KG5vZGUucm93SWQsIGlzVmlzaWJsZSk7XG5cbiAgICAgIGlmIChpc1Zpc2libGUpIHtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXNbJ19vbmVSb3dOdW1iZXInXSA9IHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogcm93TnVtYmVyKysgfTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHZpc2libGVOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAnbm9uZScsIHZhbHVlOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gWy4uLnZpc2libGVOb2Rlc107XG5cbiAgICBpZiAoZGlzcGF0Y2gpIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd0RhdGFDaGFuZ2VkJywgeyBub2RlczogdmlzaWJsZU5vZGVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHJvd3MgYW5jaG9yZWQgdG8gb25lIGVkZ2Ugb2YgdGhlIGdyaWQuXG4gICAqXG4gICAqIFBpbm5lZCByb3dzIGFyZSBkZWxpYmVyYXRlbHkga2VwdCBvdXQgb2YgYHJvd05vZGVzYCBhbmRcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYDogdGhleSBhcmUgbm90IGRhdGEuIFNvcnRpbmcsIGZpbHRlcmluZywgc2VsZWN0aW9uLFxuICAgKiBleHBhbnNpb24sIHBhZ2luYXRpb24gYW5kIHRoZSB2aXNpYmxlIHJvdyBjb3VudCBhbGwgaWdub3JlIHRoZW0sIHdoaWNoIGlzXG4gICAqIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN1bW1hcnkgcm93LiBUaGV5IHJlbmRlciB3aXRoIHRoZSBzYW1lIGNvbHVtblxuICAgKiBkZWZpbml0aW9ucywgc28gcmVuZGVyZXJzIGFuZCB2YWx1ZSBnZXR0ZXJzIHdvcmsgYXMgdGhleSBkbyBldmVyeXdoZXJlXG4gICAqIGVsc2UuXG4gICAqL1xuICBwdWJsaWMgc2V0UGlubmVkUm93RGF0YShzaWRlOiBPbmVQaW5uZWRSb3dTaWRlLCByb3dEYXRhOiBUW10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSkgbm9kZS5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IChyb3dEYXRhID8/IFtdKS5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG5cbiAgICAgIC8vIElkcyBhcmUgbmFtZXNwYWNlZCBieSBzaWRlIGFuZCBwb3NpdGlvbi4gVGhleSBuZXZlciBjb2xsaWRlIHdpdGggYSBkYXRhXG4gICAgICAvLyByb3cncyBpZCwgYW5kIHRoZXkgYXJlIHN0YWJsZSBhY3Jvc3MgcmVidWlsZHMsIHdoaWNoIGtlZXBzIHRoZSByZW5kZXJlZFxuICAgICAgLy8gYGRhdGEtY2VsbC1pZGAgYXR0cmlidXRlcyBzdGFibGUgdG9vLlxuICAgICAgY29uc3Qgbm9kZSA9IG5ldyBPbmVSb3dOb2RlPFQ+KGBvbmUtcGlubmVkLSR7c2lkZX0tJHtpbmRleH1gLCBkYXRhLCBpbmRleCk7XG5cbiAgICAgIG5vZGUubGV2ZWwgPSAwO1xuICAgICAgbm9kZS5sZWFmID0gdHJ1ZTtcbiAgICAgIG5vZGUudmlzaWJsZSA9IHRydWU7XG4gICAgICBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywge1xuICAgICAgc2lkZSxcbiAgICAgIG5vZGVzOiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZS4gUmVhZC1vbmx5OyBjaGFuZ2UgdGhlbSB3aXRoIGBzZXRQaW5uZWRSb3dEYXRhYC4gKi9cbiAgcHVibGljIGdldFBpbm5lZFJvd05vZGVzKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUpOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyByZW9yZGVyaW5nXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqXG4gICAqIGBfb3JpZ2luYWxSb3dOb2Rlc2AgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3Igcm93IG9yZGVyOiBpdHMgaW5zZXJ0aW9uXG4gICAqIG9yZGVyIGlzIHdoYXQgYGFwcGx5U29ydGluZ2AgZmFsbHMgYmFjayB0byB3aGVuIHRoZSBzb3J0IG1vZGVsIGVtcHRpZXMsIGFuZFxuICAgKiB3aGF0IGEgcmVidWlsZCB3YWxrcy4gYF9yb3dOb2Rlc2AgaXMgb25seSB0aGUgY3VycmVudCBkaXNwbGF5IG9yZGVyLiBBIG1vdmVcbiAgICogdGhhdCB0b3VjaGVkIG9uZSBhbmQgbm90IHRoZSBvdGhlciB3b3VsZCBlaXRoZXIgYmUgdW5kb25lIGJ5IHRoZSBuZXh0IHNvcnRcbiAgICogY2hhbmdlIG9yIGludmlzaWJsZSB1bnRpbCBvbmUgaGFwcGVuZWQsIHNvIGJvdGggYXJlIHJld3JpdHRlbiB0b2dldGhlci5cbiAgICovXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRpc3BsYXllZCBvcmRlciBpcyB0aGUgZGF0YSBvcmRlciwgYW5kIHNvIHdoZXRoZXIgYSBtYW51YWwgbW92ZVxuICAgKiB3b3VsZCBzdXJ2aXZlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgcmVhc29uIHJlb3JkZXJpbmcgaXMgdW5hdmFpbGFibGUsIG9yIGBudWxsYCB3aGVuIGl0IGlzIGZpbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKTogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsIHtcblxuICAgIGlmICh0aGlzLnRyZWVEYXRhKSByZXR1cm4gJ3RyZWVEYXRhJztcblxuICAgIGlmICh0aGlzLl9zb3J0TW9kZWwubGVuZ3RoID4gMCkgcmV0dXJuICdzb3J0ZWQnO1xuXG4gICAgaWYgKGlzRmlsdGVyQWN0aXZlKHRoaXMuX2FjdGl2ZUZpbHRlcnMsIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPz8gJycpKSByZXR1cm4gJ2ZpbHRlcmVkJztcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIENvbnZlbmllbmNlIGludmVyc2Ugb2Yge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufS4gKi9cbiAgcHVibGljIGNhblJlb3JkZXJSb3dzKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKSA9PT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGZyb20gb25lIHBvc2l0aW9uIHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEluZGljZXMgYXJlIHBvc2l0aW9ucyBpbiB0aGUgZ3JpZCdzIHJvdyBvcmRlciwgdGhlIHNhbWUgb3JkZXJcbiAgICogYGdldEFsbFJvd05vZGVzKClgIHJldHVybnMuIGB0YXJnZXRJbmRleGAgaXMgd2hlcmUgdGhlIHJvdyBlbmRzIHVwICphZnRlcipcbiAgICogaXQgaGFzIGJlZW4gbGlmdGVkIG91dCBvZiBgc291cmNlSW5kZXhgIOKAlCBkcmFnZ2luZyByb3cgMCB0byB0aGUgYm90dG9tIG9mIGFcbiAgICogNS1yb3cgZ3JpZCBpcyBgbW92ZVJvdygwLCA0KWAsIG5vdCBgbW92ZVJvdygwLCA1KWAuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcm93cyBtb3ZlZC4gYGZhbHNlYCB3aGVuIHRoZSBtb3ZlIHdhcyByZWplY3RlZCDigJRcbiAgICogICAgICAgICAgb3V0LW9mLXJhbmdlIGluZGljZXMsIGEgbm8tb3AsIG9yIGFuIG9yZGVyIHRoZSBncmlkIGRvZXMgbm90IG93blxuICAgKiAgICAgICAgICAoc2VlIHtAbGluayBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbn0pIOKAlCBzbyBhIGNhbGxlciBjYW4gdGVsbCBhXG4gICAqICAgICAgICAgIHJlZnVzZWQgbW92ZSBmcm9tIGFuIGFwcGxpZWQgb25lLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3coc291cmNlSW5kZXg6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmNhblJlb3JkZXJSb3dzKCkpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG9yZGVyID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZUluZGV4KSB8fCAhTnVtYmVyLmlzSW50ZWdlcih0YXJnZXRJbmRleCkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChzb3VyY2VJbmRleCA8IDAgfHwgc291cmNlSW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IG9yZGVyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgW21vdmVkXSA9IG9yZGVyLnNwbGljZShzb3VyY2VJbmRleCwgMSk7XG5cbiAgICBvcmRlci5zcGxpY2UodGFyZ2V0SW5kZXgsIDAsIG1vdmVkKTtcblxuICAgIC8vIFJlYnVpbHQgcmF0aGVyIHRoYW4gbXV0YXRlZDogYSBNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciwgYW5kIHRoZXJlXG4gICAgLy8gaXMgbm8gd2F5IHRvIHJlcG9zaXRpb24gYSBrZXkgd2l0aGluIG9uZS5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzID0gbmV3IE1hcChvcmRlci5tYXAobm9kZSA9PiBbbm9kZS5yb3dJZCwgbm9kZV0pKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gb3JkZXI7XG5cbiAgICB0aGlzLnJlaW5kZXhSb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdyb3dPcmRlckNoYW5nZWQnLCB7IG5vZGVzOiB0aGlzLl92aXNpYmxlUm93Tm9kZXMgYXMgT25lUm93Tm9kZTxUPltdLCBub2RlOiBtb3ZlZCwgZnJvbUluZGV4OiBzb3VyY2VJbmRleCwgdG9JbmRleDogdGFyZ2V0SW5kZXggfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGlkZW50aWZpZWQgYnkgaWQuIENvbnZlbmllbnQgd2hlbiB0aGUgY2FsbGVyIGhvbGRzIGEgbm9kZSByYXRoZXJcbiAgICogdGhhbiBhIHBvc2l0aW9uIOKAlCB0aGUgaW5kZXggaXQgd2FzIGJ1aWx0IHdpdGggZ29lcyBzdGFsZSBhZnRlciBhbnkgbW92ZS5cbiAgICovXG4gIHB1YmxpYyBtb3ZlUm93QnlJZChyb3dJZDogc3RyaW5nLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBjb25zdCBzb3VyY2VJbmRleCA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSByb3dJZCk7XG5cbiAgICByZXR1cm4gc291cmNlSW5kZXggPT09IC0xID8gZmFsc2UgOiB0aGlzLm1vdmVSb3coc291cmNlSW5kZXgsIHRhcmdldEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zdGFtcCBgcm93SW5kZXhgIGZyb20gdGhlIGN1cnJlbnQgb3JkZXIuXG4gICAqXG4gICAqIFJvdyBpbmRleCBpcyBkZW5vcm1hbGlzZWQgb250byBldmVyeSBub2RlLCBhbmQgaGFsZiB0aGUgZ3JpZCByZWFkcyBpdCDigJRcbiAgICogY2VsbCBwYXJhbXMsIHRoZSByYW5nZSBzZWxlY3Rpb24sIHRoZSBkZXRhaWwgbG9va3VwLiBMZWF2aW5nIGl0IHN0YWxlIGFmdGVyXG4gICAqIGEgbW92ZSBwdXRzIGV2ZXJ5IHJvdyBiZWxvdyB0aGUgZHJvcCBwb2ludCBvbmUgb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWluZGV4Um93cygpOiB2b2lkIHtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiBub2RlLnNldFJvd0luZGV4KGluZGV4KSk7XG5cbiAgICAvLyBTaWxlbnQ6IHJvdyBudW1iZXJzIGFuZCB0aGUgdmlzaWJsZSBsaXN0IGhhdmUgdG8gYmUgcmVidWlsdCwgYnV0IHRoZVxuICAgIC8vIGByb3dEYXRhQ2hhbmdlZGAgdGhhdCBub3JtYWxseSBmb2xsb3dzIGRlZmVycyBhIGZyYW1lIGFuZCByZS1zZWVkcyBkZXRhaWxcbiAgICAvLyByb3dzLiBBIGtleWJvYXJkIGRyYWcgZmlyZXMgb25lIG9mIHRoZXNlIHBlciBhcnJvdyBrZXksIGFuZCBgbW92ZVJvd2BcbiAgICAvLyBhbm5vdW5jZXMgaXRzZWxmIHRocm91Z2ggYHJvd09yZGVyQ2hhbmdlZGAgaW5zdGVhZC5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldFZpc2libGVSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVSb3dOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0aW5nIE1vZGVsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBvblNvcnRDaGFuZ2VkKHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10pIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3NvcnRNb2RlbCA9IHNvcnRNb2RlbDtcblxuICAgIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzb3J0Q2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Jvd05vZGVzLCBzb3J0TW9kZWw6IHRoaXMuX3NvcnRNb2RlbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTb3J0aW5nKCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPT09IDApIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJhdG9yID0gKGE6IE9uZVJvd05vZGU8VD4sIGI6IE9uZVJvd05vZGU8VD4pOiBudW1iZXIgPT4ge1xuXG4gICAgICBmb3IgKGNvbnN0IHNvcnRJdGVtIG9mIHRoaXMuX3NvcnRNb2RlbCkge1xuXG4gICAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQgfSA9IHNvcnRJdGVtO1xuICAgICAgICBjb25zdCB2YWxBID0gZ2V0RmllbGRWYWx1ZShhLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHZhbEIgPSBnZXRGaWVsZFZhbHVlKGIuZGF0YSwgY29sSWQgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgY29tcGFyaXNvblJlc3VsdCA9IHRoaXMuY29tcGFyZVZhbHVlcyh2YWxBLCB2YWxCLCBzb3J0KTtcblxuICAgICAgICBpZiAoY29tcGFyaXNvblJlc3VsdCAhPT0gMCkge1xuXG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25SZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV0uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdHJlZSBzb3J0cyBzaWJsaW5ncyB3aXRoaW4gdGhlaXIgcGFyZW50LCBuZXZlciBhY3Jvc3MgaXQg4oCUIGEgZmxhdFxuICAgIC8vIHNvcnQgb2YgdGhlIHdob2xlIGxpc3QgaW50ZXJsZWF2ZWQgcGFyZW50cyB3aXRoIG90aGVyIHBhcmVudHMnIGNoaWxkcmVuXG4gICAgLy8gYW5kIHNjcmFtYmxlZCB0aGUgaGllcmFyY2h5LiBTb3J0aW5nIHRoZSBzaWJsaW5nIGFycmF5cyBhbmQgcmUtd2Fsa2luZ1xuICAgIC8vIGRlcHRoLWZpcnN0IGtlZXBzIGV2ZXJ5IHBhcmVudCBpbW1lZGlhdGVseSBhYm92ZSBpdHMgb3duIGNoaWxkcmVuLFxuICAgIC8vIHdoaWNoIGByZWZyZXNoVmlzaWJsZU5vZGVzYCBhbHNvIGRlcGVuZHMgb24gZm9yIGl0cyB2aXNpYmlsaXR5IGNhY2hlLlxuICAgIC8vIEdyb3VwIHJvd3MgY2FycnkgdGhlaXIgYWdncmVnYXRlcyBpbiBgZGF0YWAsIHNvIHNvcnRpbmcgYSBncm91cGVkIGdyaWRcbiAgICAvLyBvbiBhbiBhZ2dyZWdhdGVkIGNvbHVtbiBvcmRlcnMgdGhlIGdyb3VwcyBieSB0aGVpciBhZ2dyZWdhdGUuXG4gICAgY29uc3QgZmxhdHRlbmVkOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcblxuICAgIGNvbnN0IHdhbGsgPSAoc2libGluZ3M6IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSA9PiB7XG5cbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5zaWJsaW5nc10uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHNvcnRlZCkge1xuXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcblxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSB3YWxrKG5vZGUuY2hpbGRyZW4gYXMgT25lUm93Tm9kZTxUPltdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc29ydGVkO1xuICAgIH07XG5cbiAgICB3YWxrKFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maWx0ZXIobm9kZSA9PiAhbm9kZS5wYXJlbnQpKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gZmxhdHRlbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKHZhbEE6IGFueSwgdmFsQjogYW55LCBzb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyk6IG51bWJlciB7XG5cbiAgICAvLyBgdW5kZWZpbmVkYCBoYXMgdG8gYmUgdHJlYXRlZCBhcyBlbXB0eSBhbG9uZ3NpZGUgYG51bGxgOiBnZXRGaWVsZFZhbHVlXG4gICAgLy8gcmV0dXJucyB1bmRlZmluZWQgZm9yIGEgbWlzc2luZyBmaWVsZCBvciBhbiB1bnJlc29sdmVkIGRvdHRlZCBwYXRoLCBhbmRcbiAgICAvLyBjb21wYXJpbmcgdW5kZWZpbmVkIHdpdGggPCAvID4geWllbGRzIGZhbHNlIGJvdGggd2F5cywgd2hpY2ggbWFkZSBzdWNoXG4gICAgLy8gcm93cyBzZXR0bGUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhlIHNvcnQgaGFwcGVuZWQgdG8gZW5jb3VudGVyIHRoZW0uXG4gICAgY29uc3QgYUVtcHR5ID0gdmFsQSA9PT0gbnVsbCB8fCB2YWxBID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgYkVtcHR5ID0gdmFsQiA9PT0gbnVsbCB8fCB2YWxCID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYUVtcHR5ICYmIGJFbXB0eSkgcmV0dXJuIDA7XG4gICAgaWYgKGFFbXB0eSkgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIGlmIChiRW1wdHkpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcblxuICAgIGlmICh0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSB2YWxBLmxvY2FsZUNvbXBhcmUodmFsQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyBjb21wYXJpc29uIDogLWNvbXBhcmlzb247XG4gICAgfVxuXG4gICAgaWYgKHZhbEEgPCB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG4gICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogUm93IFNlbGVjdGlvbiBGZWF0dXJlIChPcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuXG4gICAgY29uc3Qgcm93SWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICByb3dJZHMucHVzaChub2RlLnJvd0lkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGwocm93SWRzKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IGFsbE5vZGVzTm90U2VsZWN0ZWQ6IGZhbHNlLCBhbGxOb2Rlc1NlbGVjdGVkOiB0cnVlLCBzZWxlY3RlZDogdHJ1ZSwgbm9kZTogbnVsbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdCBhbGwgbm9kZXMgKG9wdGltaXplZClcbiAgICovXG4gIHB1YmxpYyBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZChmYWxzZSk7XG5cbiAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RBbGwoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7XG4gICAgICAgIGFsbE5vZGVzTm90U2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGFsbE5vZGVzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIG5vZGU6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qgb3IgZGVzZWxlY3Qgb25lIHJvdywgaG9ub3VyaW5nIHRoZSBncmlkJ3Mgc2VsZWN0aW9uIG1vZGUuXG4gICAqXG4gICAqIFRoZSBtb2RlIHJ1bGUgdXNlZCB0byBsaXZlIGluIHRoZSBjaGVja2JveCBjb21wb25lbnQsIHdoaWNoIG1lYW50IHRoZSBvbmx5XG4gICAqIHdheSB0byBzZWxlY3QgYSByb3cgd2FzIHRvIGNsaWNrIHRoYXQgY2hlY2tib3gg4oCUIGFueXRoaW5nIGVsc2UgcmVhY2hpbmcgZm9yXG4gICAqIGB0b2dnbGVTZWxlY3Rpb25gIGdvdCBtdWx0aS1zZWxlY3QgYmVoYXZpb3VyIG9uIGEgc2luZ2xlLXNlbGVjdCBncmlkLiBJdFxuICAgKiBsaXZlcyBoZXJlIHNvIGV2ZXJ5IHBhdGggaW50byBzZWxlY3Rpb24gb2JleXMgdGhlIHNhbWUgcnVsZS5cbiAgICpcbiAgICogQHJldHVybnMgYGZhbHNlYCB3aGVuIHRoZSBncmlkIGhhcyBubyBzZWxlY3Rpb24gbW9kZSwgc28gYSBjYWxsZXIgY2FuIHRlbGxcbiAgICogICAgICAgICAgYSByZWZ1c2VkIHJlcXVlc3QgZnJvbSBhbiBhcHBsaWVkIG9uZS5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dTZWxlY3Rpb24ocm93SWQ6IHN0cmluZywgc2VsZWN0ZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIXRoaXMuX3Jvd1NlbGVjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBTaW5nbGUgc2VsZWN0IGlzIFwidGhpcyByb3cgYW5kIG5vIG90aGVyXCIsIHdoaWNoIG1lYW5zIGNsZWFyaW5nIGZpcnN0LlxuICAgIGlmICh0aGlzLl9yb3dTZWxlY3Rpb24gPT09ICdzaW5nbGUnKSB0aGlzLmRlc2VsZWN0QWxsKCk7XG5cbiAgICB0aGlzLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBldmVyeSByb3cgYmV0d2VlbiB0d28sIGluY2x1c2l2ZSwgaW4gZGlzcGxheSBvcmRlci5cbiAgICpcbiAgICogV2hhdCBhIHNoaWZ0LWV4dGVuZGVkIGtleWJvYXJkIHNlbGVjdGlvbiBuZWVkcy4gTXVsdGktc2VsZWN0IG9ubHkg4oCUIGFcbiAgICogc2luZ2xlLXNlbGVjdCBncmlkIGhhcyBubyBtZWFuaW5nZnVsIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdFJvd1JhbmdlKGZyb21Sb3dJZDogc3RyaW5nLCB0b1Jvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgdGhpcy5fcm93U2VsZWN0aW9uICE9PSAnbXVsdGlwbGUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBvcmRlciA9IHRoaXMuX3Zpc2libGVSb3dOb2Rlcy5sZW5ndGggPyB0aGlzLl92aXNpYmxlUm93Tm9kZXMgOiB0aGlzLl9yb3dOb2RlcztcblxuICAgIGNvbnN0IGZyb20gPSBvcmRlci5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSBmcm9tUm93SWQpO1xuICAgIGNvbnN0IHRvID0gb3JkZXIuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gdG9Sb3dJZCk7XG5cbiAgICBpZiAoZnJvbSA9PT0gLTEgfHwgdG8gPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBpZHMgPSBvcmRlclxuICAgICAgLnNsaWNlKE1hdGgubWluKGZyb20sIHRvKSwgTWF0aC5tYXgoZnJvbSwgdG8pICsgMSlcbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhpZHMsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSkge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIHNlbGVjdGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWQocm93SWQ6IHN0cmluZykge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb25Nb2RlKCkgPT09ICdzaW5nbGUnKSB7XG5cbiAgICAgICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHRydWUpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBzZWxlY3RlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWRCeUlkcyhyb3dJZHM6IHN0cmluZ1tdLCBzZWxlY3RlZDogYm9vbGVhbiA9IHRydWUpIHtcblxuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgaWYgKG5vZGUpIHtcblxuICAgICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICYgU2V0IEZ1bmN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEFsbFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM/Lmxlbmd0aCA+IDAgPyBbLi4udGhpcy5fcm93Tm9kZXNdIDogW107XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGF0YVNlbGVjdGVkKCk6IFRbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5zZWxlY3RlZCkubWFwKG5vZGUgPT4gKHsgLi4ubm9kZS5kYXRhIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUuc2VsZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+IDAgPyBbLi4ubm9kZXNdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1uIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJNb2RlbCgpOiBPbmVGaWx0ZXJNb2RlbFtdIHtcblxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldEZpbHRlck1vZGVsKG1vZGVsOiBPbmVGaWx0ZXJNb2RlbFtdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gbW9kZWw7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlckFjdGl2ZShmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycy5zb21lKGYgPT4gZi5maWVsZCA9PT0gZmllbGQgJiYgZi5jb25kaXRpb25zLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aWNrIGZpbHRlclxuICAgKi9cbiAgcHVibGljIHNldFF1aWNrRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSAodmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgY29sdW1uIHZhbGlkYXRvcnMgb3ZlciBvbmUgcm93LlxuICAgKlxuICAgKiBSdWxlcyBydW4gaW4gb3JkZXIgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IGZhaWx1cmUsIHNvIGEgZmllbGQgYXBwZWFycyBhdFxuICAgKiBtb3N0IG9uY2UuIEZpZWxkcyB0aGF0IHBhc3NlZCBhcmUgYWJzZW50IHJhdGhlciB0aGFuIG1hcHBlZCB0byBgbnVsbGAuXG4gICAqXG4gICAqIFRoZSByb3cgdHlwZSBjb21lcyBmcm9tIHRoZSBncmlkJ3Mgb3duIGBUYCDigJQgdGhpcyB1c2VkIHRvIGRlY2xhcmUgaXRzIG93blxuICAgKiBgPFQ+YCwgd2hpY2ggc2hhZG93ZWQgdGhlIGNsYXNzIHBhcmFtZXRlciBhbmQgbGV0IGFuIGBPbmVHcmlkQXBpPEVtcGxveWVlPmBcbiAgICogaGFwcGlseSB2YWxpZGF0ZSBhbiB1bnJlbGF0ZWQgc2hhcGUgYWdhaW5zdCBlbXBsb3llZSBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlUm93KHJvdzogVCwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzPFQ+IHtcblxuICAgIGNvbnN0IGVycm9yczogT25lUm93VmFsaWRhdGlvbkVycm9yczxUPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXG4gICAgICAvLyBBIGNvbHVtbiBjYW4gb25seSBjb250cmlidXRlIGFuIGVycm9yIGlmIGl0IGhhcyBib3RoIHJ1bGVzIGFuZCBhIGZpZWxkXG4gICAgICAvLyB0byBrZXkgdGhlbSB1bmRlci5cbiAgICAgIGlmICghY29sdW1uLmZpZWxkIHx8ICFjb2x1bW4udmFsaWRhdGlvblJ1bGVzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY29sdW1uLnZhbGlkYXRpb25SdWxlcykge1xuXG4gICAgICAgIGNvbnN0IGVycm9yID0gcnVsZShyb3dbY29sdW1uLmZpZWxkXSwgcm93KTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcblxuICAgICAgICAgIGVycm9yc1tjb2x1bW4uZmllbGRdID0gZXJyb3I7XG5cbiAgICAgICAgICBicmVhazsgLy8gZmlyc3QgZmFpbHVyZSBwZXIgY29sdW1uIHdpbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBjb2x1bW4gdmFsaWRhdG9ycyBvdmVyIGEgd2hvbGUgZGF0YXNldC5cbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIGB2YWxpZGF0ZVJvd2Agc28gdGhlIHR3byBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBjb3VudHNcbiAgICogYXMgaW52YWxpZCDigJQgdGhleSBwcmV2aW91c2x5IGNhcnJpZWQgc2VwYXJhdGUgY29waWVzIG9mIHRoZSBzYW1lIGxvb3AuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVBbGxSb3dzKHJvd0RhdGE6IFRbXSwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVWYWxpZGF0aW9uUmVzdWx0PFQ+IHtcblxuICAgIGNvbnN0IGFsbEVycm9ycyA9IHJvd0RhdGEubWFwKHJvdyA9PiB0aGlzLnZhbGlkYXRlUm93KHJvdywgY29sdW1ucykpO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID0gYWxsRXJyb3JzLnNvbWUoZXJyb3JzID0+IE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4geyBlcnJvcnM6IGFsbEVycm9ycywgdmFsaWQ6ICFoYXNFcnJvcnMsIGludmFsaWQ6IGhhc0Vycm9ycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIGV2ZXJ5IG5vZGUsIGRlcHRoLWZpcnN0LCBvbmNlIGVhY2guXG4gICAqXG4gICAqIGByb3dOb2Rlc2AgaXMgYWxyZWFkeSB0aGUgZmxhdHRlbmVkIHRyZWUg4oCUIGBidWlsZFJvd05vZGVzYCBwdXNoZXMgZXZlcnlcbiAgICogbm9kZSBpbnRvIGl0IGFzIGl0IGRlc2NlbmRzIOKAlCBzbyB3YWxraW5nIGl0IGlzIHRoZSB3aG9sZSB0cmF2ZXJzYWwuIFRoZVxuICAgKiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB3YWxrZWQgdGhhdCBmbGF0IGxpc3QgKmFuZCogcmVjdXJzZWQgaW50b1xuICAgKiBgY2hpbGRyZW5gLCB2aXNpdGluZyBldmVyeSBuZXN0ZWQgbm9kZSB0d2ljZSBhbmQgZXZlcnkgZGVwdGgtMyBub2RlIHRocmVlXG4gICAqIHRpbWVzLiBgaW5kZXhgIGlzIHRoZSBub2RlJ3MgcG9zaXRpb24gaW4gdGhlIGZsYXR0ZW5lZCBvcmRlciwgbWF0Y2hpbmdcbiAgICogYG5vZGUucm93SW5kZXhgLCByYXRoZXIgdGhhbiBpdHMgcG9zaXRpb24gYW1vbmcgaXRzIHNpYmxpbmdzLlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hOb2RlKGNhbGxiYWNrOiAobm9kZTogT25lUm93Tm9kZTxUPiwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IGNhbGxiYWNrKG5vZGUsIGluZGV4KSk7XG4gIH1cblxuICAvKiogVHJhdmVyc2Ugb25seSBsZWFmIG5vZGVzLCBvbmNlIGVhY2gsIGluIGZsYXR0ZW5lZCBvcmRlci4gKi9cbiAgcHVibGljIGZvckVhY2hMZWFmTm9kZShjYWxsYmFjazogKG5vZGU6IE9uZVJvd05vZGU8VD4sIGluZGV4OiBudW1iZXIpID0+IHZvaWQpIHtcblxuICAgIGxldCBsZWFmSW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGlmIChub2RlLmxlYWYpIGNhbGxiYWNrKG5vZGUsIGxlYWZJbmRleCsrKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93Tm9kZUJ5SWQocm93SWQ6IHN0cmluZyk6IE9uZVJvd05vZGU8VD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvY29sbGFwc2UgYSBub2RlXG4gICAqL1xuICBwdWJsaWMgc2V0VHJlZURhdGFDaGlsZHJlbkZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZmllbGQ7XG4gIH1cblxuICBwdWJsaWMgc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQoZGVmYXVsdEV4cGFuZGVkOiBudW1iZXIpIHtcblxuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSBkZWZhdWx0RXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5zaW9uIHN0YXRlIGxpdmVzIGluIHR3byBwbGFjZXMsIGFuZCB0aGV5IGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLlxuICAgKlxuICAgKiBgT25lR3JpZEV4cGFuc2lvblNlcnZpY2VgIHJlY29yZHMgb25seSAqZGVsaWJlcmF0ZSogY2hhbmdlcyDigJQgYSBjbGljaywgb3JcbiAgICogb25lIG9mIHRoZSBtZXRob2RzIGJlbG93LiBJdCBpcyBhbiBvdmVycmlkZSBsYXllcjogYGJ1aWxkUm93Tm9kZXNgIGNvbnN1bHRzXG4gICAqIGl0IGZpcnN0IGFuZCBmYWxscyBiYWNrIHRvIGBncm91cERlZmF1bHRFeHBhbmRlZGAgZm9yIGV2ZXJ5IHJvdyB0aGUgdXNlclxuICAgKiBoYXMgbm90IHRvdWNoZWQuIFRoYXQgaXMgd2hhdCBsZXRzIGEgbGF0ZXIgYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBjaGFuZ2VcbiAgICogdGFrZSBlZmZlY3QsIGFuZCB3aGF0IGxldHMgYSBjb2xsYXBzZSBzdXJ2aXZlIGEgcmVidWlsZC5cbiAgICpcbiAgICogYG5vZGUuZXhwYW5kZWRgIGlzIHRoZSByZXNvbHZlZCB0cnV0aCBmb3IgYSByb3csIGRlZmF1bHRzIGluY2x1ZGVkLiBQdWJsaWNcbiAgICogcmVhZHMgcmVwb3J0IHRoYXQ7IHRoZSBvdmVycmlkZSBzZXRzIHN0YXkgaW50ZXJuYWwuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdGhlIHNldHRlcnMgYmVsb3cgbWFpbnRhaW46IGBleHBhbmRlZGAgaXMgb25seSBldmVyIHRydWUgZm9yXG4gICAqIGEgbm9kZSB0aGF0IGNhbiBleHBhbmQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlRXhwYW5kQWxsKGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICB0aGlzLmZvckVhY2hOb2RlKG5vZGUgPT4ge1xuXG4gICAgICBpZiAoIW5vZGUuZXhwYW5kYWJsZSkgcmV0dXJuO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKG5vZGUucm93SWQsIGV4cGFuZGVkKVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5kZWRCeUlkKHJvd0lkOiBzdHJpbmcsIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgaWYgKG5vZGU/LmV4cGFuZGFibGUpIHtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChyb3dJZCwgZXhwYW5kZWQpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIGlmIChyb3dJZHMgJiYgcm93SWRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgZm9yIChsZXQgcm93SWQgb2Ygcm93SWRzKSB7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgICBpZiAobm9kZT8uZXhwYW5kYWJsZSkge1xuXG4gICAgICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgY3VycmVudGx5IGV4cGFuZGVkIHJvdywgaW4gdHJlZSBvcmRlci5cbiAgICpcbiAgICogRGVyaXZlZCBmcm9tIHRoZSBub2RlcyByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgb3ZlcnJpZGUgcmVjb3JkLCBzbyByb3dzXG4gICAqIG9wZW5lZCBieSBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGFyZSBpbmNsdWRlZCDigJQgcHJldmlvdXNseSB0aGlzIHJldHVybmVkXG4gICAqIG9ubHkgcm93cyBzb21lb25lIGhhZCBleHBsaWNpdGx5IHRvZ2dsZWQsIGFuZCBjYW1lIGJhY2sgZW1wdHkgb24gZmlyc3QgbG9hZFxuICAgKiB3aGlsZSB0aGUgZmlyc3QgbGV2ZWwgd2FzIHZpc2libHkgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBhbmRlZEJ5SWRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dOb2Rlc1xuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS5leHBhbmRhYmxlICYmIG5vZGUuZXhwYW5kZWQpXG5cbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBzZXREZXRhaWxSb3dEYXRhKG5vZGU6IE9uZVJvd05vZGU8VD4sIGRldGFpbERhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0R2V0RGV0YWlsUm93RGF0YShnZXREZXRhaWxSb3dEYXRhOiAocGFyYW1zOiBPbmVHZXREZXRhaWxSb3dEYXRhUGFyYW1zKSA9PiB2b2lkKSB7XG5cbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gZ2V0RGV0YWlsUm93RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIFN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2Uuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLl9jb250ZXh0KTtcblxuICAgIC8vIENlbGwgc3RhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb2x1bW5zLCBzbyByZXBsYWNpbmcgdGhlbSB3aG9sZXNhbGVcbiAgICAvLyBzdGFsZXMgZXZlcnkgbm9kZSBidWlsdCBiZWZvcmUgdGhpcyByYW4uIFRyZWUgYW5kIGdyb3VwaW5nIG1vZGUgaGl0XG4gICAgLy8gdGhpcyBvbiBldmVyeSBsb2FkOiB0aGUgZ3JvdXAgY29sdW1uIHJlZ2lzdGVycyBmcm9tIGEgZGVmZXJyZWRcbiAgICAvLyBzZXRDb2x1bW5EZWZzLCBhZnRlciB0aGUgaG9zdCBoYXMgdHlwaWNhbGx5IGFscmVhZHkgbG9hZGVkIHJvd3Mg4oCUXG4gICAgLy8gaG9zdHMgdXNlZCB0byBoYXZlIHRvIGRlZmVyIHNldFJvd0RhdGEgdGhlbXNlbHZlcyB0byBkb2RnZSBpdC5cbiAgICB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbihpZDogc3RyaW5nLCBjaGFuZ2VzOiBQYXJ0aWFsPE9uZUNvbHVtbkRlZjxUPj4pOiB2b2lkIHtcblxuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMudmlzaWJsZUNvbHVtbkZpZWxkcygpO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnVwZGF0ZUNvbHVtbkRlZihpZCwgY2hhbmdlcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBPbmx5IHdoZW4gdGhlIHNldCBvZiB2aXNpYmxlIGNvbHVtbnMgY2hhbmdlZCAoYSBoaWRlLCBhIHNob3cpOiBhIGNlbGxcbiAgICAvLyBzdGF0ZSBjYW4gYXBwZWFyIG9yIGRpc2FwcGVhciB0aGVuLiBXaWR0aCBwYXRjaGVzIOKAlCB0aGlzIG1ldGhvZCBydW5zXG4gICAgLy8gcGVyIG1vdXNlbW92ZSBkdXJpbmcgYSByZXNpemUg4oCUIHNraXAgdGhlIE8ocm93cyDDlyBjb2x1bW5zKSBwYXNzLlxuICAgIGlmICh0aGlzLnZpc2libGVDb2x1bW5GaWVsZHMoKSAhPT0gYmVmb3JlKSB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXNpYmxlIGZpZWxkcyBhcyBvbmUgY29tcGFyYWJsZSBrZXkuICovXG4gIHByaXZhdGUgdmlzaWJsZUNvbHVtbkZpZWxkcygpOiBzdHJpbmcge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnM/Lm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkKS5qb2luKCd8JykgPz8gJyc7XG4gIH1cblxuICAvKiogUmVjb21wdXRlIGV2ZXJ5IG5vZGUncyBjZWxsIHN0YXRlcyBhZ2FpbnN0IHRoZSBjdXJyZW50IGNvbHVtbnMuICovXG4gIHByaXZhdGUgcmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTogdm9pZCB7XG5cbiAgICBjb25zdCByZWZyZXNoID0gKG5vZGU6IE9uZVJvd05vZGUpID0+IG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICB0aGlzLl9yb3dOb2Rlcy5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLnRvcC5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLmJvdHRvbS5mb3JFYWNoKHJlZnJlc2gpO1xuICB9XG5cbiAgcHVibGljIHJlb3JkZXJDb2x1bW5EZWZzKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5yZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUm93IGdyb3VwaW5nXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgX3Jvd0dyb3VwRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9hZ2dDb2x1bW5zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdO1xuXG4gIC8qKiBUaGUgZmllbGRzIHRoZSByb3dzIGFyZSBncm91cGVkIGJ5LCBpbiBuZXN0aW5nIG9yZGVyLiBFbXB0eSB3aGVuIG9mZi4gKi9cbiAgcHVibGljIGdldCByb3dHcm91cEZpZWxkcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93R3JvdXBGaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogVHVybiByb3cgZ3JvdXBpbmcgb24uIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgd2hlbiBjb2x1bW5cbiAgICogZGVmaW5pdGlvbnMgZGVjbGFyZSBgcm93R3JvdXBgOyB0aGUgZ3JpZCB0aGVuIGJlaGF2ZXMgYXMgYSB0cmVlIG92ZXJcbiAgICogc3ludGhldGljIGdyb3VwIHJvd3MsIGFuZCBgc2V0Um93RGF0YWAgLyBgdXBkYXRlUm93RGF0YWAga2VlcCB0YWtpbmcgdGhlXG4gICAqIGZsYXQgcm93cyB0aGV5IGFsd2F5cyB0b29rLlxuICAgKi9cbiAgcHVibGljIHNldFJvd0dyb3VwaW5nKGdyb3VwRmllbGRzOiBzdHJpbmdbXSwgYWdncmVnYXRpb25zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdKTogdm9pZCB7XG5cbiAgICB0aGlzLl9yb3dHcm91cEZpZWxkcyA9IGdyb3VwRmllbGRzID8/IFtdO1xuICAgIHRoaXMuX2FnZ0NvbHVtbnMgPSBhZ2dyZWdhdGlvbnMgPz8gW107XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVW5kbyAvIHJlZG8gb2YgY2VsbCBlZGl0c1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF91bmRvTGltaXQgPSAwO1xuICBwcml2YXRlIF91bmRvU3RhY2s6IHsgcm93SWQ6IHN0cmluZzsgZmllbGQ6IHN0cmluZzsgb2xkVmFsdWU6IGFueTsgbmV3VmFsdWU6IGFueSB9W10gPSBbXTtcbiAgcHJpdmF0ZSBfcmVkb1N0YWNrOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBjb21taXR0ZWQgY2VsbCBlZGl0cyBmb3IgdW5kby9yZWRvLiBDYWxsZWQgYnlcbiAgICogYE9uZUdyaWRDb21wb25lbnRgIGZyb20gYFt1bmRvUmVkb0NlbGxFZGl0aW5nXWA7IHRoZSBzdGFjayBrZWVwcyB0aGUgbGFzdFxuICAgKiBgbGltaXRgIGVkaXRzLiBQcm9ncmFtbWF0aWMgYHNldERhdGFWYWx1ZWAgd3JpdGVzIGFyZSBub3QgcmVjb3JkZWQg4oCUIG9ubHlcbiAgICogY29tbWl0cywgdGhlIG9uZXMgdGhhdCByYWlzZSBgY2VsbFZhbHVlQ2hhbmdlZGAgd2l0aG91dCBhIHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBlbmFibGVVbmRvUmVkb0NlbGxFZGl0aW5nKGxpbWl0OiBudW1iZXIgPSAxMCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3VuZG9MaW1pdCA+IDApIHJldHVybjtcblxuICAgIHRoaXMuX3VuZG9MaW1pdCA9IE1hdGgubWF4KE1hdGguZmxvb3IobGltaXQpLCAxKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NlbGxWYWx1ZUNoYW5nZWQnLCAoZXZlbnQ6IENlbGxWYWx1ZUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICBpZiAoZXZlbnQuc291cmNlKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3VuZG9TdGFjay5wdXNoKHsgcm93SWQ6IGV2ZW50Lm5vZGUucm93SWQsIGZpZWxkOiBldmVudC5maWVsZCwgb2xkVmFsdWU6IGV2ZW50Lm9sZFZhbHVlLCBuZXdWYWx1ZTogZXZlbnQubmV3VmFsdWUgfSk7XG5cbiAgICAgIGlmICh0aGlzLl91bmRvU3RhY2subGVuZ3RoID4gdGhpcy5fdW5kb0xpbWl0KSB0aGlzLl91bmRvU3RhY2suc2hpZnQoKTtcblxuICAgICAgLy8gQSBuZXcgZWRpdCBmb3JrcyBoaXN0b3J5OyB3aGF0IHdhcyB1bmRvbmUgY2FuIG5vIGxvbmdlciBiZSByZWRvbmUuXG4gICAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXZlcnQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdHRlZCBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyB1bmRvbmUuICovXG4gIHB1YmxpYyB1bmRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3VuZG9TdGFjaywgdGhpcy5fcmVkb1N0YWNrLCAndW5kbycpO1xuICB9XG5cbiAgLyoqIFJlLWFwcGx5IHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyByZWRvbmUuICovXG4gIHB1YmxpYyByZWRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3JlZG9TdGFjaywgdGhpcy5fdW5kb1N0YWNrLCAncmVkbycpO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRVbmRvU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3VuZG9TdGFjay5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFJlZG9TaXplKCk6IG51bWJlciB7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVkb1N0YWNrLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGF5RWRpdChcbiAgICBmcm9tOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHRvOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHNvdXJjZTogJ3VuZG8nIHwgJ3JlZG8nLFxuICApOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGVkaXQgPSBmcm9tLnBvcCgpO1xuXG4gICAgaWYgKCFlZGl0KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChlZGl0LnJvd0lkKTtcblxuICAgIC8vIFRoZSByb3cgY2FuIGJlIGdvbmUg4oCUIGEgc2V0Um93RGF0YSByZXBsYWNlZCB0aGUgZGF0YSB1bmRlciB0aGUgc3RhY2suXG4gICAgLy8gVGhlIGVkaXQgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiByZXBsYXllZCBvbnRvIG5vdGhpbmcuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZSA9PT0gJ3VuZG8nID8gZWRpdC5vbGRWYWx1ZSA6IGVkaXQubmV3VmFsdWU7XG4gICAgY29uc3QgcHJldmlvdXMgPSBzb3VyY2UgPT09ICd1bmRvJyA/IGVkaXQubmV3VmFsdWUgOiBlZGl0Lm9sZFZhbHVlO1xuXG4gICAgKG5vZGUuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbZWRpdC5maWVsZF0gPSB2YWx1ZTtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcblxuICAgIHRvLnB1c2goZWRpdCk7XG5cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zPy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGVkaXQuZmllbGQpID8/IG51bGw7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsVmFsdWVDaGFuZ2VkJywge1xuICAgICAgbm9kZSxcbiAgICAgIGRhdGE6IG5vZGUuZGF0YSxcbiAgICAgIGNvbHVtbjogY29sdW1uIGFzIE9uZUNvbHVtbkRlZjxUPixcbiAgICAgIGZpZWxkOiBlZGl0LmZpZWxkLFxuICAgICAgb2xkVmFsdWU6IHByZXZpb3VzLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlLFxuICAgICAgc291cmNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ2xpZW50LXNpZGUgcGFnaW5hdGlvblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9jbGllbnRQYWdpbmF0aW9uID0gZmFsc2U7XG4gIHByaXZhdGUgX3BhZ2VTaXplID0gMjU7XG4gIHByaXZhdGUgX2N1cnJlbnRQYWdlID0gMTtcblxuICAvKiogVGhlIHBhZ2luZyBzdGF0ZSwgd2hlbiB0aGUgZ3JpZCBwYWdlcyBpdHMgb3duIHJvd3MuICovXG4gIHB1YmxpYyBnZXQgcGFnaW5hdGlvblN0YXRlKCk6IFJlYWRvbmx5PHsgZW5hYmxlZDogYm9vbGVhbjsgcGFnZVNpemU6IG51bWJlcjsgY3VycmVudFBhZ2U6IG51bWJlciB9PiB7XG5cbiAgICByZXR1cm4geyBlbmFibGVkOiB0aGlzLl9jbGllbnRQYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5fcGFnZVNpemUsIGN1cnJlbnRQYWdlOiB0aGlzLl9jdXJyZW50UGFnZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gZ3JpZC1vd25lZCBwYWdpbmcgb24gb3Igb2ZmLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIGZyb20gaXRzXG4gICAqIGBjbGllbnRTaWRlUGFnaW5hdGlvbmAgaW5wdXQ7IHRoZSBkaXNwbGF5IHNsaWNlIGlzIHdoYXQgY2hhbmdlcyDigJQgdGhlXG4gICAqIGZ1bGwgZGF0YXNldCBzdGF5cyBiZWhpbmQgdGhlIEFQSSAoc2VsZWN0aW9uLCBmaWx0ZXJzIGFuZCBzb3J0aW5nIGtlZXBcbiAgICogb3BlcmF0aW5nIG9uIGFsbCBvZiBpdCkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q2xpZW50U2lkZVBhZ2luYXRpb24oZW5hYmxlZDogYm9vbGVhbiwgcGFnZVNpemU/OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuX2NsaWVudFBhZ2luYXRpb24gPSBlbmFibGVkO1xuXG4gICAgaWYgKHBhZ2VTaXplICYmIHBhZ2VTaXplID4gMCkgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcbiAgfVxuXG4gIC8qKiBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBhbmQgcmV0dXJuIHRvIHRoZSBmaXJzdCBwYWdlLiAqL1xuICBwdWJsaWMgc2V0UGFnZVNpemUocGFnZVNpemU6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCB8fCAhKHBhZ2VTaXplID4gMCkpIHJldHVybjtcblxuICAgIHRoaXMuX3BhZ2VTaXplID0gTWF0aC5mbG9vcihwYWdlU2l6ZSk7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSAxO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRvIGEgcGFnZSAoMS1iYXNlZCkuIENsYW1wZWQgdG8gYXQgbGVhc3QgMTsgdGhlIHRvcCBlbmQgY2xhbXBzIHdoZW4gdGhlIHNsaWNlIGlzIHRha2VuLiAqL1xuICBwdWJsaWMgc2V0Q3VycmVudFBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1heChNYXRoLmZsb29yKHBhZ2UpLCAxKTtcblxuICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2N1cnJlbnRQYWdlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHRhcmdldDtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNsaWNlIG9mIHJvd3MgdGhlIGN1cnJlbnQgcGFnZSBzaG93cyDigJQgYSBwYXNzdGhyb3VnaCB3aGlsZSBwYWdpbmcgaXNcbiAgICogb2ZmLiBUaGUgYm9keSByb3V0ZXMgaXRzIHJlbmRlciBsaXN0IHRocm91Z2ggaGVyZSwgYWZ0ZXIgcmVwb3J0aW5nIHRoZVxuICAgKiBmdWxsIGNvdW50LCBzbyBgcm93Q291bnRDaGFuZ2VkYCBrZWVwcyBtZWFuaW5nIFwicm93cyBhZnRlciBmaWx0ZXJpbmdcIlxuICAgKiB3aGV0aGVyIG9yIG5vdCB0aGUgZ3JpZCBwYWdlcy5cbiAgICovXG4gIHB1YmxpYyBwYWdlTm9kZXMobm9kZXM6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudFBhZ2luYXRpb24pIHJldHVybiAobm9kZXMgPz8gW10pIGFzIE9uZVJvd05vZGU8VD5bXTtcblxuICAgIGNvbnN0IGxhc3RQYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKChub2Rlcz8ubGVuZ3RoID8/IDApIC8gdGhpcy5fcGFnZVNpemUpLCAxKTtcblxuICAgIC8vIEEgc2hyaW5raW5nIGRhdGFzZXQgKGEgZmlsdGVyLCBhIGRlbGV0ZSkgY2FuIHN0cmFuZCB0aGUgcGFnZSBwYXN0IHRoZVxuICAgIC8vIGVuZDsgY2xhbXBpbmcgaGVyZSBzaG93cyB0aGUgbGFzdCBwYWdlIGluc3RlYWQgb2YgYW4gZW1wdHkgb25lLlxuICAgIGlmICh0aGlzLl9jdXJyZW50UGFnZSA+IGxhc3RQYWdlKSB0aGlzLl9jdXJyZW50UGFnZSA9IGxhc3RQYWdlO1xuXG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuX3BhZ2VTaXplO1xuXG4gICAgcmV0dXJuIChub2RlcyA/PyBbXSkuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5fcGFnZVNpemUpIGFzIE9uZVJvd05vZGU8VD5bXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaXplIHRoZSBmbGV4IGNvbHVtbnMgaW50byB0aGUgZ2l2ZW4gd2lkdGguXG4gICAqXG4gICAqIENhbGxlZCBieSB0aGUgZ3JpZCBib2R5IHdpdGggaXRzIG93biB2aWV3cG9ydCB3aWR0aCDigJQgb24gZmlyc3QgcmVuZGVyLCBvblxuICAgKiBjb250YWluZXIgcmVzaXplIGFuZCBhZnRlciBjb2x1bW4gY2hhbmdlcyDigJQgc28gYGNvbHVtbkRlZi5mbGV4YCB3b3Jrc1xuICAgKiB3aXRob3V0IHRoZSBob3N0IGRvaW5nIGFueXRoaW5nLiBBbHNvIGNhbGxhYmxlIGRpcmVjdGx5IHdpdGggYW55IHdpZHRoLlxuICAgKiBBIG5vLW9wIHdoZW4gbm8gdmlzaWJsZSBjb2x1bW4gZGVjbGFyZXMgYGZsZXhgIG9yIG5vdGhpbmcgd291bGQgY2hhbmdlLlxuICAgKi9cbiAgcHVibGljIGFwcGx5RmxleFdpZHRocyhhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuY29sdW1uU2VydmljZS5hcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGdyaWQgYXMgQ1NWOiB2aXNpYmxlIGNvbHVtbnMgaW4gZGlzcGxheSBvcmRlciwgdmlzaWJsZSByb3dzXG4gICAqIGluIGN1cnJlbnQgc29ydCBvcmRlciwgdmFsdWVzIHRocm91Z2ggdGhlIHNhbWUgZ2V0dGVyL2Zvcm1hdHRlciBwaXBlbGluZVxuICAgKiB0aGUgY2VsbHMgcmVuZGVyIHdpdGguIFBpbm5lZCByb3dzIGFuZCBkZXRhaWwgZ3JpZHMgYXJlIG5vdCBkYXRhIGFuZCBhcmVcbiAgICogbm90IGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGdldERhdGFBc0NzdihvcHRpb25zOiBPbmVDc3ZFeHBvcnRPcHRpb25zID0ge30pOiBzdHJpbmcge1xuXG4gICAgY29uc3Qgbm9kZXMgPSBvcHRpb25zLm9ubHlTZWxlY3RlZCA/IHRoaXMuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpIDogdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuXG4gICAgcmV0dXJuIGJ1aWxkQ3N2KG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXSwgdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucyBhcyBPbmVDb2x1bW5EZWY8VD5bXSwgdGhpcy5fY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIENTViBhbmQgaGFuZCBpdCB0byB0aGUgYnJvd3NlciBhcyBhIGRvd25sb2FkLiAqL1xuICBwdWJsaWMgZXhwb3J0RGF0YUFzQ3N2KG9wdGlvbnM6IE9uZUNzdkV4cG9ydE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5nZXREYXRhQXNDc3Yob3B0aW9ucyldLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG5cbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBsaW5rLmRvd25sb2FkID0gb3B0aW9ucy5maWxlTmFtZSA/PyAnZXhwb3J0LmNzdic7XG4gICAgbGluay5jbGljaygpO1xuXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChsaW5rLmhyZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgb3IgaGlkZSBvbmUgY29sdW1uLiBBIGhpZGRlbiBjb2x1bW4ga2VlcHMgaXRzIG9yZGVyLCB3aWR0aCBhbmQgcGluLFxuICAgKiBzbyBzaG93aW5nIGl0IGFnYWluIHJlc3RvcmVzIGl0IGV4YWN0bHkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShpZDogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbihpZCwgeyBoaWRlOiAhdmlzaWJsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0YWJsZSBsYXlvdXQgc3RhdGU6IG9uZSBKU09OLXNhZmUgZW50cnkgcGVyIGNvbHVtbiDigJQgaGlkZGVuIG9uZXNcbiAgICogaW5jbHVkZWQg4oCUIGluIGRpc3BsYXkgb3JkZXIuIEZlZWQgaXQgYmFjayB0aHJvdWdoIGBhcHBseUNvbHVtblN0YXRlYC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5TdGF0ZVNuYXBzaG90KCk6IE9uZUNvbHVtblN0YXRlRW50cnlbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlU25hcHNob3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc25hcHNob3QgZnJvbSBgZ2V0Q29sdW1uU3RhdGVTbmFwc2hvdGA6IG9yZGVyLCB3aWR0aCwgcGluIGFuZFxuICAgKiB2aXNpYmlsaXR5LiBJZHMgdGhlIGdyaWQgbm8gbG9uZ2VyIGhhcyBhcmUgc2tpcHBlZCwgc28gYSBzdGFsZSBzbmFwc2hvdFxuICAgKiBkZWdyYWRlcyB0byBhIHBhcnRpYWwgcmVzdG9yZSByYXRoZXIgdGhhbiBhbiBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBhcHBseUNvbHVtblN0YXRlKGVudHJpZXM6IE9uZUNvbHVtblN0YXRlRW50cnlbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLmFwcGx5Q29sdW1uU3RhdGUoZW50cmllcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBBIHJlc3RvcmUgY2FuIHNob3cgY29sdW1ucyB0aGF0IHdlcmUgaGlkZGVuIHdoZW4gdGhlIHJvd3Mgd2VyZSBidWlsdCxcbiAgICAvLyBhbmQgdGhlaXIgY2VsbHMgaGF2ZSBubyBzdGF0ZSB5ZXQuXG4gICAgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hlY2tib3ggc2VsZWN0aW9uIGZlYXR1cmVzXG4gICAqL1xuICBwdWJsaWMgc2V0Tm9kZUFuZENoaWxkcmVuU2VsZWN0ZWQobm9kZTogT25lUm93Tm9kZSwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcblxuICAgIGNvbnN0IHJvd0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY29sbGVjdCA9IChuOiBPbmVSb3dOb2RlKSA9PiB7XG5cbiAgICAgIHJvd0lkcy5hZGQobi5yb3dJZCk7XG5cbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKSB7XG5cbiAgICAgICAgbi5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNvbGxlY3QoY2hpbGQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29sbGVjdChub2RlKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhBcnJheS5mcm9tKHJvd0lkcyksIHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBJZGVudGljYWwgdG8gYHVwZGF0ZUNlbGxTdGF0ZXNgLiBLZXB0IGFzIGFuIGFsaWFzIHNvIGV4aXN0aW5nXG4gICAqIGNhbGxlcnMga2VlcCB3b3JraW5nOyBwcmVmZXIgYHVwZGF0ZUNlbGxTdGF0ZXNgLCB3aGljaCBzYXlzIHdoYXQgaXQgZG9lcy5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVOb2RlU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpIHtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDZWxsU3RhdGUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd05vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgcm93Tm9kZS5jZWxsU3RhdGVzW2NvbHVtbi5maWVsZF0gPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlKHJvd05vZGUsIGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZSBldmVyeSBjZWxsIG9mIG9uZSByb3cgYW5kIHJlcGFpbnQgaXQuXG4gICAqXG4gICAqIFRoZSByZXBhaW50IGlzIHRoZSBwb2ludDogdGhpcyBpcyB3aGF0IGEgY2FsbGVyIHJlYWNoZXMgZm9yIGFmdGVyIG11dGF0aW5nXG4gICAqIGEgcm93IGluIHBsYWNlLCBhbmQgaXQgdXNlZCB0byByZWdlbmVyYXRlIHRoZSBzdGF0ZSBhbmQgc3RvcCB0aGVyZS4gVGhlXG4gICAqIGJvZHkgcmVuZGVycyB3aXRoIE9uUHVzaCwgc28gbm90aGluZyBtYXJrZWQgaXQgZGlydHkgYW5kIHRoZSBuZXcgc3RhdGUgc2F0XG4gICAqIHVucmVhZCB1bnRpbCBzb21lIHVucmVsYXRlZCBldmVudCBoYXBwZW5lZCB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24g4oCUXG4gICAqIHdoaWNoIGlzIHdoeSBjYWxsZXJzIGVuZGVkIHVwIG51ZGdpbmcgdGhlIGdyaWQgd2l0aCBhIHN5bnRoZXRpYyBET00gZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmICghcm93Tm9kZSkgcmV0dXJuO1xuXG4gICAgcm93Tm9kZS5jZWxsU3RhdGVzID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMocm93Tm9kZSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsU3RhdGVDaGFuZ2VkJywgeyBkYXRhOiByb3dOb2RlLmRhdGEsIG5vZGU6IHJvd05vZGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciB0aGF0IFJlYWN0cyB0byBEZXRhaWwgQ2hhbmdlc1xuICAgKi9cbiAgLyoqXG4gICAqIEtlZXAgYSBtYXN0ZXIgcm93J3MgcmVzZXJ2ZWQgaGVpZ2h0IGluIHN0ZXAgd2l0aCBpdHMgZGV0YWlsIHJvd3MuXG4gICAqXG4gICAqIFR3byBsaXN0ZW5lcnMgdXNlZCB0byBiZSByZWdpc3RlcmVkIGhlcmUgYW5kIHRocm93biBhd2F5OiBhbiBlbXB0eVxuICAgKiBgcm93RGF0YUNoYW5nZWRgIGhhbmRsZXIgd2hvc2UgdW5zdWJzY3JpYmUgd2FzIG5ldmVyIGtlcHQsIGFuZCBhblxuICAgKiBgZXhwYW5kZWRDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIGJvZHkgd2FzIGVudGlyZWx5IGNvbW1lbnRlZCBvdXQuIEJvdGggYXJlXG4gICAqIGdvbmUg4oCUIGEgbGlzdGVuZXIgd2l0aCBubyBiZWhhdmlvdXIgaXMgYSBsZWFrIHdpdGggbm8gdXBzaWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmVEZXRhaWwgPSBub2RlLm9uKCdkZXRhaWxSb3dEYXRhQ2hhbmdlZCcsICh7IG5vZGUgfSkgPT4ge1xuXG4gICAgICBpZiAodGhpcy5fYXBpVHlwZSA9PT0gJ21hc3RlcicpIHtcblxuICAgICAgICB0aGlzLnJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTm9kZUNsZWFudXAobm9kZS5yb3dJZCwgW3Vuc3Vic2NyaWJlRGV0YWlsXSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTm9kZUNsZWFudXAocm93SWQ6IHN0cmluZywgdW5zdWJzOiBBcnJheTwoKSA9PiB2b2lkPik6IHZvaWQge1xuXG4gICAgLy8gTWVyZ2Ugd2l0aCBhbnkgZXhpc3RpbmcgY2xlYW51cHMgZm9yIHRoaXMgcm93SWRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCkgPz8gW107XG5cbiAgICB0aGlzLl9ub2RlQ2xlYW51cE1hcC5zZXQocm93SWQsIFsuLi5leGlzdGluZywgLi4udW5zdWJzXSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBOb2RlKHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGNvbnN0IGNsZWFudXBzID0gdGhpcy5fbm9kZUNsZWFudXBNYXAuZ2V0KHJvd0lkKTtcblxuICAgIGNsZWFudXBzPy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuZGVsZXRlKHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZGF0YSwgcmVsZWFzaW5nIHdoYXQgdGhleSBob2xkLlxuICAgKlxuICAgKiBUaGlzIGV4aXN0ZWQgYnV0IHdhcyBuZXZlciBjYWxsZWQ6IGBzZXRSb3dEYXRhYCBhbmQgYHVwZGF0ZVJvd0RhdGFgIGVhY2hcbiAgICogZGVsZXRlZCBzdHJhaWdodCBvdXQgb2YgYF9vcmlnaW5hbFJvd05vZGVzYCwgc28gYSByZW1vdmVkIG5vZGUga2VwdCBpdHNcbiAgICogbGlzdGVuZXJzIGFuZCBpdHMgZW50cnkgaW4gYF9ub2RlQ2xlYW51cE1hcGAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgZ3JpZC5cbiAgICogQm90aCBub3cgY29tZSB0aHJvdWdoIGhlcmUsIHdoaWNoIHVuc3Vic2NyaWJlcyBhbmQgY2xlYXJzIHRoZSBub2RlIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwcnVuZVJlbW92ZWROb2Rlcyh2YWxpZFJvd0lkczogU2V0PHN0cmluZz4pOiB2b2lkIHtcblxuICAgIGZvciAoY29uc3QgW3Jvd0lkLCBub2RlXSBvZiB0aGlzLl9vcmlnaW5hbFJvd05vZGVzKSB7XG5cbiAgICAgIGlmICghdmFsaWRSb3dJZHMuaGFzKHJvd0lkKSkge1xuXG4gICAgICAgIHRoaXMuY2xlYW51cE5vZGUocm93SWQpOyAgLy8gdW5zdWJzY3JpYmUgbGlzdGVuZXJzXG5cbiAgICAgICAgbm9kZS5kZXN0cm95KCk7ICAgICAgICAgICAvLyBjbGVhciBub2RlJ3Mgb3duIGxpc3RlbmVyIG1hcFxuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVpZ2h0IGEgbWFzdGVyIHJvdyBtdXN0IHJlc2VydmUgZm9yIGl0cyBkZXRhaWwgZ3JpZDpcbiAgICogcm93SGVpZ2h0IHggY2xhbXAocm93cywgbWluUm93cywgbWF4Um93cykgKyBoZWFkZXJIZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgaGVpZ2h0T3B0aW9ucyA9IHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zPy5kZXRhaWxHcmlkT3B0aW9ucz8uZGV0YWlsUm93SGVpZ2h0T3B0aW9ucztcblxuICAgIC8vIFJlYWNoYWJsZSB3aGVuZXZlciBtYXN0ZXJEZXRhaWwgaXMgb24gYnV0IGRldGFpbENlbGxSZW5kZXJlclBhcmFtcyBpc1xuICAgIC8vIGluY29tcGxldGU7IHdpdGhvdXQgdGhlIGd1YXJkIHRoaXMgdGhyZXcgZnJvbSBpbnNpZGUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgaWYgKCFoZWlnaHRPcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBtaW5Sb3dzID0gaGVpZ2h0T3B0aW9ucy5taW5Sb3dzO1xuICAgIGNvbnN0IG1heFJvd3MgPSBoZWlnaHRPcHRpb25zLm1heFJvd3M7XG5cbiAgICBjb25zdCBtaW5IZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtaW5Sb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuICAgIGNvbnN0IG1heEhlaWdodCA9ICh0aGlzLnJvd0hlaWdodCAqIG1heFJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG5cbiAgICBjb25zdCByb3dzID0gbm9kZS5kZXRhaWxSb3dEYXRhICYmIG5vZGUuZGV0YWlsUm93RGF0YS5sZW5ndGggPyBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoIDogMDtcblxuICAgIG5vZGUuZGV0YWlsUm93SGVpZ2h0ID0gcm93cyA8PSBtaW5Sb3dzID8gbWluSGVpZ2h0IDogcm93cyA+PSBtYXhSb3dzID8gbWF4SGVpZ2h0IDogKHRoaXMucm93SGVpZ2h0ICogcm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGV2ZXJ5dGhpbmcgdGhlIGdyaWQgaG9sZHMuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudC5uZ09uRGVzdHJveWAuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlcyBhcmUgZGVsaWJlcmF0ZWx5ICpub3QqIG51bGxlZCBvdXQgYW55IG1vcmUuIFRoZXkgYXJlIGluamVjdGVkLFxuICAgKiBBbmd1bGFyIG93bnMgdGhlaXIgbGlmZXRpbWUsIGFuZCBudWxsaW5nIHRoZW0gb25seSBndWFyYW50ZWVkIGFcbiAgICogYFR5cGVFcnJvcmAgZm9yIGFueSBjYWxsYmFjayB0aGF0IGFycml2ZWQgYWZ0ZXIgdGVhcmRvd24g4oCUIGEgZGV0YWlsLXJvd1xuICAgKiBmZXRjaCByZXNvbHZpbmcgbGF0ZSwgb3IgdGhlIGJvZHkncyBkZWZlcnJlZCB1cGRhdGUuIGBfZGVzdHJveWVkYCBtYWtlc1xuICAgKiB0aG9zZSBjYWxscyBuby1vcHMgaW5zdGVhZCwgd2hpY2ggaXMgd2hhdCBhIHRvcm4tZG93biBvYmplY3Qgc2hvdWxkIGRvLlxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZXZlcnkgcGVyLW5vZGUgbGlzdGVuZXIgYmVmb3JlIGRyb3BwaW5nIHRoZSBub2Rlcy5cbiAgICBmb3IgKGNvbnN0IHJvd0lkIG9mIEFycmF5LmZyb20odGhpcy5fbm9kZUNsZWFudXBNYXAua2V5cygpKSkge1xuXG4gICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTtcbiAgICB9XG5cbiAgICAvLyBgZGVzdHJveWAgZHJvcHMgdGhlIHRyZWUgbGlua3MgYW5kIHRoZSBsaXN0ZW5lcnM7IHRoZSBBUEkgbm8gbG9uZ2VyIGhhc1xuICAgIC8vIHRvIHJlYWNoIGluIGFuZCB1bnBpY2sgZWFjaCBub2RlIGl0c2VsZi5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcblxuICAgIGZvciAoY29uc3Qgc2lkZSBvZiBbJ3RvcCcsICdib3R0b20nXSBhcyBPbmVQaW5uZWRSb3dTaWRlW10pIHtcblxuICAgICAgdGhpcy5fcGlubmVkUm93Tm9kZXNbc2lkZV0uZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl92aXNpYmxlUm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmNsZWFyKCk7XG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuY2xlYXIoKTtcbiAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuXG4gICAgLy8gUmVsZWFzZSB0aGUgYmFjay1yZWZlcmVuY2UgdGhlIGNlbGwgc2VydmljZSBob2xkcywgc28gYSB0b3JuLWRvd24gYXBpIGlzXG4gICAgLy8gbm90IGtlcHQgYWxpdmUgYnkgdGhlIHNlcnZpY2UgdGhhdCBvdXRsaXZlcyB0aGlzIGNhbGwuXG4gICAgdGhpcy5jZWxsU2VydmljZS5zZXRHcmlkQXBpKG51bGwpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG4gICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gW107XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fc29ydE1vZGVsID0gW107XG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG5cbiAgICB0aGlzLm1hc3RlckRldGFpbCA9IGZhbHNlO1xuICAgIHRoaXMudHJlZURhdGEgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IG51bGw7XG4gICAgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9IDA7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBudWxsO1xuICAgIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuX2dldERldGFpbFJvd0RhdGEgPSBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGRlc3Ryb3lgIGhhcyBydW4uIExhdGUgY2FsbGJhY2tzIGNoZWNrIHRoaXMgYmVmb3JlIGRvaW5nIHdvcmsuICovXG4gIHB1YmxpYyBnZXQgZGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3llZDtcbiAgfVxufVxuIl19
1244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFNakQsTUFBTSxPQUFPLFVBQVU7SUFxQnJCLHdEQUF3RDtJQUN4RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7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QVUsQ0FBQztJQUN6QixDQUFDOytHQTdxRFUsVUFBVTttSEFBVixVQUFVOzs0RkFBVixVQUFVO2tCQUR0QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWxzL29uZS10cmVlLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgT25lQ29sdW1uRGVmLCBPbmVDb2x1bW5TdGF0ZUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tIFwiLi9vbmUtcm93LW5vZGUuY2xhc3NcIjtcbmltcG9ydCB7IE9uZUdyaWRJbml0T3B0aW9ucywgT25lR3JpZFR5cGUsIE9uZVJvd1RyYW5zYWN0aW9uLCBPbmVTb3J0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lR3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzLCBPbmVWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vbW9kZWxzL29uZS12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE9uZUZpbHRlck1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkRXhwYW5zaW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcywgT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcyB9IGZyb20gXCIuLi9tb2RlbHMvb25lLW1hc3Rlci1kZXRhaWwubW9kZWxcIjtcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL29uZS1ncmlkLXJvdy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBmaWx0ZXJUcmVlTm9kZSwgaXNGaWx0ZXJBY3RpdmUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtZmlsdGVyLmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRDc3YsIE9uZUNzdkV4cG9ydE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtY3N2LmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRHcm91cGVkUm93cywgT25lQWdnQ29sdW1uLCBPTkVfR1JPVVBfSURfRklFTEQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtcm93LWdyb3VwaW5nLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgT25lUGlubmVkUm93U2lkZSwgUm93U2VsZWN0aW9uTW9kZSB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWxcIjtcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vZy1jb2x1bW4uc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lR3JpZEFwaTxUID0gYW55PiB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFB1YmxpYyBzdGF0ZVxuICAvL1xuICAvLyBFeHBvc2VkIGFzIGdldHRlcnMsIG5vdCBmaWVsZHMuIFRoZXNlIHdlcmUgd3JpdGFibGUsIHNvIGEgY29uc3VtZXIgY291bGRcbiAgLy8gY29ycnVwdCB0aGUgZ3JpZCBieSBhc3NpZ25pbmcgdG8gdGhlbSDigJQgc3dhcHBpbmcgYHJvd05vZGVzYCBmb3IgYW5cbiAgLy8gdW5yZWxhdGVkIGFycmF5LCBvciBzZXR0aW5nIGBzb3J0TW9kZWxgIHdpdGhvdXQgdGhlIHJvd3MgZXZlciBiZWluZ1xuICAvLyByZS1zb3J0ZWQuIFJlYWRzIGFyZSB1bmNoYW5nZWQ7IG9ubHkgYXNzaWdubWVudCBpcyBub3cgYSBjb21waWxlIGVycm9yLlxuICAvL1xuICAvLyBUaGUgYXJyYXktdmFsdWVkIG9uZXMgYXJlIHR5cGVkIGByZWFkb25seSBUW11gLCB3aGljaCBzdG9wcyBgcHVzaGAgYW5kXG4gIC8vIGBzcGxpY2VgIGF0IGNvbXBpbGUgdGltZSB3aXRob3V0IGNvcHlpbmcgb24gZXZlcnkgcmVhZC4gVXNlXG4gIC8vIGBnZXRBbGxSb3dOb2RlcygpYCB3aGVuIHlvdSB3YW50IGEgY29weSB5b3Ugb3duLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlID0gbnVsbDtcbiAgcHJpdmF0ZSBfYXBpVHlwZTogT25lR3JpZFR5cGUgPSBudWxsO1xuICBwcml2YXRlIF9yb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByaXZhdGUgX3NvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcblxuICAvKiogVW5pcXVlIHBlciBncmlkIGluc3RhbmNlLCBhc3NpZ25lZCBkdXJpbmcgYGluaXRgLiAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqIFRoZSBgW2NvbnRleHRdYCB0aGUgZ3JpZCB3YXMgZ2l2ZW4uICovXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgLyoqIFNlbGVjdGlvbiBtb2RlLCBjYXB0dXJlZCBkdXJpbmcgYGluaXRgLiBDaGFuZ2luZyB0aGUgaW5wdXQgbGF0ZXIgaGFzIG5vIGVmZmVjdC4gKi9cbiAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKTogUm93U2VsZWN0aW9uTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbjtcbiAgfVxuXG4gIC8qKiBXaGljaCByb2xlIHRoaXMgaW5zdGFuY2UgcGxheXM6IHNpbXBsZSwgbWFzdGVyLCBkZXRhaWwgb3IgdHJlZS4gKi9cbiAgcHVibGljIGdldCBhcGlUeXBlKCk6IE9uZUdyaWRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVHlwZTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBub2RlIHRoZSBncmlkIGhvbGRzLCBpbiBmbGF0dGVuZWQgb3JkZXIuICovXG4gIHB1YmxpYyBnZXQgcm93Tm9kZXMoKTogcmVhZG9ubHkgT25lUm93Tm9kZTxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM7XG4gIH1cblxuICAvKiogVGhlIHNvcnQgbW9kZWwgY3VycmVudGx5IGFwcGxpZWQuIENoYW5nZSBpdCB3aXRoIGBvblNvcnRDaGFuZ2VkYC4gKi9cbiAgcHVibGljIGdldCBzb3J0TW9kZWwoKTogcmVhZG9ubHkgT25lU29ydE1vZGVsPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0TW9kZWw7XG4gIH1cblxuXG4gIHByaXZhdGUgcm93SGVpZ2h0OiBudW1iZXIgPSAyNjtcbiAgcHJpdmF0ZSBoZWFkZXJSb3dIZWlnaHQ6IG51bWJlciA9IDMyO1xuICBwcml2YXRlIF9jdXJyZW50SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3F1aWNrRmlsdGVyVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlcnM6IE9uZUZpbHRlck1vZGVsW10gPSBbXTtcblxuICBwcml2YXRlIF92aXNpYmxlUm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9waW5uZWRSb3dOb2RlczogUmVjb3JkPE9uZVBpbm5lZFJvd1NpZGUsIE9uZVJvd05vZGU8VD5bXT4gPSB7IHRvcDogW10sIGJvdHRvbTogW10gfTtcbiAgcHJpdmF0ZSBfb3JpZ2luYWxSb3dOb2RlczogTWFwPHN0cmluZywgT25lUm93Tm9kZTxUPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX25vZGVDbGVhbnVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PCgpID0+IHZvaWQ+PigpOyAvLyBDbGVhbnVwIHJlZ2lzdHJ5IChwcmV2ZW50cyBtZW1vcnkgbGVha3MpXG4gIHByaXZhdGUgX2Rlc3Ryb3llZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEFkdmFuY2VkIEZlYXR1cmVzXG4gIHByaXZhdGUgdHJlZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgcHJpdmF0ZSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudD86IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogU3VwcGxpZXMgYSBtYXN0ZXIgcm93J3MgZGV0YWlsIHJvd3MuIFNldCB0aHJvdWdoIGBzZXRHZXREZXRhaWxSb3dEYXRhYDtcbiAgICogcHJldmlvdXNseSBhIHdyaXRhYmxlIHB1YmxpYyBmaWVsZCB3aXRoIGEgc2V0dGVyIGJlc2lkZSBpdCwgd2hpY2ggbGVmdCB0d29cbiAgICogd2F5cyB0byBkbyB0aGUgc2FtZSB0aGluZyBhbmQgb25lIG9mIHRoZW0gdW5jaGVja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGV0YWlsUm93RGF0YTogKHBhcmFtczogT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcykgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbHVtblNlcnZpY2U6IE9nQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIHJvd1NlcnZpY2U6IE9uZUdyaWRSb3dTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlcnZpY2U6IE9uZUdyaWRDZWxsU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHNlbGVjdGlvblNlcnZpY2U6IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZXhwYW5zaW9uU2VydmljZTogT25lR3JpZEV4cGFuc2lvblNlcnZpY2VcbiAgKSB7IH1cblxuICAvKipcbiAgICogU3RhbmQgdGhlIGdyaWQgdXAuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgZnJvbSBgbmdPbkluaXRgLlxuICAgKlxuICAgKiBUYWtlcyBhIHNpbmdsZSBgT25lR3JpZEluaXRPcHRpb25zYCByYXRoZXIgdGhhbiB0aGUgdGVuIHBvc2l0aW9uYWxcbiAgICogYXJndW1lbnRzIGl0IHVzZWQgdG8sIHNvIGEgY2FsbCBzaXRlIHJlYWRzIGFzIHRoZSBjb25maWd1cmF0aW9uIGl0IGlzIGFuZFxuICAgKiBhIG5ldyBvcHRpb24gbm8gbG9uZ2VyIG1lYW5zIGVkaXRpbmcgZXZlcnkgY2FsbGVyLlxuICAgKlxuICAgKiBAaW50ZXJuYWwgQXBwbGljYXRpb25zIG9idGFpbiBhIHJlYWR5LW1hZGUgQVBJIGZyb20gYChvbkdyaWRSZWFkeSlgOyB0aGV5XG4gICAqIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgdGhlbXNlbHZlcy5cbiAgICovXG4gIGluaXQob3B0aW9uczogT25lR3JpZEluaXRPcHRpb25zPFQ+KTogdm9pZCB7XG5cbiAgICBjb25zdCB7XG4gICAgICBncmlkVHlwZSxcbiAgICAgIGNvbHVtbkRlZnMsXG4gICAgICBkZWZhdWx0Q29sdW1uRGVmID0ge30sXG4gICAgICBncm91cENvbHVtbkRlZnMgPSBbXSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgcm93U2VsZWN0aW9uID0gbnVsbCxcbiAgICAgIG1hc3RlckRldGFpbCA9IGZhbHNlLFxuICAgICAgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbCxcbiAgICAgIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbCxcbiAgICAgIHRyZWVEYXRhID0gZmFsc2UsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICB0aGlzLl9pZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuX2FwaVR5cGUgPSBncmlkVHlwZTtcbiAgICB0aGlzLl9yb3dTZWxlY3Rpb24gPSByb3dTZWxlY3Rpb247XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBtYXN0ZXJEZXRhaWw7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gICAgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IGRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgIHRoaXMudHJlZURhdGEgPSB0cmVlRGF0YTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZXRTZWxlY3Rpb25Nb2RlKHJvd1NlbGVjdGlvbik7XG5cbiAgICAvLyBTeW50aGV0aWMgZ3JvdXAgcm93cyBjYXJyeSB0aGVpciBvd24gc3RhYmxlIGlkIOKAlCB0aGUgcGF0aCBvZiBncm91cFxuICAgIC8vIHZhbHVlcyDigJQgd2hpY2ggbm8gaG9zdCBnZXRSb3dJZCBrbm93cyBob3cgdG8gZGVyaXZlLiBUaGUgd3JhcHBlciByZWFkc1xuICAgIC8vIGl0IGZpcnN0IGFuZCBkZWZlcnMgdG8gdGhlIGhvc3QncyBmdW5jdGlvbiAob3IgdGhlIHV1aWQgZmFsbGJhY2spIGZvclxuICAgIC8vIHJlYWwgcm93cywgc28gZ3JvdXBpbmcga2VlcHMgZXhwYW5zaW9uIGFjcm9zcyByZWJ1aWxkcyBldmVuIHdoZW4gdGhlXG4gICAgLy8gaG9zdCBwcm92aWRlZCBubyBpZCBmdW5jdGlvbiBhdCBhbGwuXG4gICAgY29uc3QgaG9zdEdldFJvd0lkID0gY29udGV4dD8uY29tcG9uZW50UGFyZW50Py5nZXRSb3dJZCA/PyBudWxsO1xuXG4gICAgdGhpcy5yb3dTZXJ2aWNlLnNldEdldFJvd0lkRm4oKHBhcmFtczogeyBkYXRhOiBhbnk7IHJvd0luZGV4OiBudW1iZXIgfSkgPT5cbiAgICAgIHBhcmFtcz8uZGF0YT8uW09ORV9HUk9VUF9JRF9GSUVMRF0gPz8gaG9zdEdldFJvd0lkPy4ocGFyYW1zKSA/PyBudWxsKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtbkRlZnMsIGNvbnRleHQpO1xuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaSh0aGlzKTtcbiAgICB0aGlzLmNvbHVtblNlcnZpY2UuaW5pdENvbHVtbkRlZnMoZGVmYXVsdENvbHVtbkRlZiwgY29sdW1uRGVmcywgZ3JvdXBDb2x1bW5EZWZzLCBjb250ZXh0KTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSBhcyBDb2x1bW5DaGFuZ2VkRXZlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGV2ZXJ5IHJvdywgZGlzY2FyZGluZyBzZWxlY3Rpb24gYW5kIGV4cGFuc2lvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgcm93cyByZXByZXNlbnQgc29tZXRoaW5nIG5ldy4gVG8gc3dhcCB0aGUgZGF0YSB3aGlsZVxuICAgKiBrZWVwaW5nIHdoYXQgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGFuZCBvcGVuZWQsIHVzZSBgdXBkYXRlUm93RGF0YWAuXG4gICAqL1xuICBwdWJsaWMgc2V0Um93RGF0YShyb3dEYXRhOiBUW10pIHtcblxuICAgIHRoaXMucmVidWlsZFJvd3Mocm93RGF0YSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBldmVyeSByb3csIGtlZXBpbmcgc2VsZWN0aW9uIGFuZCBleHBhbnNpb24uXG4gICAqXG4gICAqIFN0YXRlIGlzIGtleWVkIGJ5IHJvdyBpZCwgc28gdGhpcyBvbmx5IHByZXNlcnZlcyBhbnl0aGluZyBpZiB0aGUgZ3JpZCBoYXMgYVxuICAgKiBgY29udGV4dC5jb21wb25lbnRQYXJlbnQuZ2V0Um93SWRgIOKAlCBvdGhlcndpc2UgZWFjaCByZWJ1aWxkIG1pbnRzIG5ldyBpZHNcbiAgICogYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJvd0RhdGEocm93RGF0YTogVFtdKSB7XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvd0RhdGEsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIGJhdGNoIG9mIHJvdyBjaGFuZ2VzIHdpdGhvdXQgdGhlIGhvc3QgcmViaW5kaW5nIHRoZSBkYXRhc2V0OlxuICAgKiBhcHBlbmQgcm93cyAoYXQgdGhlIHJvb3QsIG9yIHVuZGVyIGEgcGFyZW50IGJ5IGlkIG9uIHRyZWUgZGF0YSksIHJlcGxhY2VcbiAgICogcm93cyBieSBpZCwgZHJvcCByb3dzIGF0IGFueSBkZXB0aC4gU2VsZWN0aW9uIGFuZCBleHBhbnNpb24gc3Vydml2ZSDigJRcbiAgICogdGhpcyBpcyBgdXBkYXRlUm93RGF0YWAgZmVkIGZyb20gdGhlIGdyaWQncyBvd24gY3VycmVudCByb3dzLCBzbyB0aGVcbiAgICogaG9zdCBrZWVwcyBubyBwYXJhbGxlbCBjb3B5IHRvIHJlY29uY2lsZS5cbiAgICpcbiAgICogUmVxdWlyZXMgYSBzdGFibGUgYGNvbnRleHQuY29tcG9uZW50UGFyZW50LmdldFJvd0lkYDogcm93cyBhcmUgbWF0Y2hlZCBieVxuICAgKiBpZCwgYW5kIHdpdGhvdXQgYW4gaWQgZnVuY3Rpb24gdGhlcmUgaXMgbm90aGluZyB0byBtYXRjaCBvbiDigJQgdGhlXG4gICAqIHRyYW5zYWN0aW9uIGlzIHJlZnVzZWQgd2l0aCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4gaGFsZi1hcHBsaWVkLlxuICAgKi9cbiAgcHVibGljIGFwcGx5VHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IE9uZVJvd1RyYW5zYWN0aW9uPFQ+KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkIHx8ICF0cmFuc2FjdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2FtcGxlID0gdHJhbnNhY3Rpb24udXBkYXRlPy5bMF0gPz8gdHJhbnNhY3Rpb24uYWRkPy5bMF1cbiAgICAgID8/ICh0cmFuc2FjdGlvbi5yZW1vdmUgPz8gW10pLmZpbmQoZW50cnkgPT4gdHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJyk7XG5cbiAgICBpZiAoc2FtcGxlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3dTZXJ2aWNlLnJlc29sdmVSb3dJZChzYW1wbGUpID09PSBudWxsKSB7XG5cbiAgICAgIGNvbnNvbGUud2FybignW29uZS1ncmlkXSBhcHBseVRyYW5zYWN0aW9uIG5lZWRzIGNvbnRleHQuY29tcG9uZW50UGFyZW50LmdldFJvd0lkIOKAlCByb3dzIGFyZSBtYXRjaGVkIGJ5IGlkLiBOb3RoaW5nIHdhcyBhcHBsaWVkLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlSWRzID0gbmV3IFNldChcbiAgICAgICh0cmFuc2FjdGlvbi5yZW1vdmUgPz8gW10pLm1hcChlbnRyeSA9PlxuICAgICAgICB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZW50cnkgOiB0aGlzLnJvd1NlcnZpY2UucmVzb2x2ZVJvd0lkKGVudHJ5KSksXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZXMgPSBuZXcgTWFwKFxuICAgICAgKHRyYW5zYWN0aW9uLnVwZGF0ZSA/PyBbXSkubWFwKGRhdGEgPT4gW3RoaXMucm93U2VydmljZS5yZXNvbHZlUm93SWQoZGF0YSksIGRhdGFdKSxcbiAgICApO1xuXG4gICAgY29uc3QgY2hpbGRyZW5GaWVsZCA9IHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkO1xuXG4gICAgLy8gUm93IGdyb3VwaW5nIGZvbGRzIGZsYXQgcm93cyBpdHNlbGYsIHNvIHRoZSB0cmFuc2FjdGlvbiBvcGVyYXRlcyBvbiB0aGVcbiAgICAvLyBsZWF2ZXMgYW5kIHJlLWdyb3VwczsgYSBwYXJlbnQgdGFyZ2V0IHdvdWxkIG5hbWUgYSBzeW50aGV0aWMgZ3JvdXAgcm93LFxuICAgIC8vIHdoaWNoIGlzIG5vdCBhIHBsYWNlIGRhdGEgY2FuIGxpdmUuXG4gICAgY29uc3QgZ3JvdXBpbmcgPSB0aGlzLl9yb3dHcm91cEZpZWxkcy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGFkZFRvUGFyZW50SWQgPSBncm91cGluZyA/IHVuZGVmaW5lZCA6IHRyYW5zYWN0aW9uLmFkZFRvUGFyZW50SWQ7XG5cbiAgICBpZiAoZ3JvdXBpbmcgJiYgdHJhbnNhY3Rpb24uYWRkVG9QYXJlbnRJZCkge1xuXG4gICAgICBjb25zb2xlLndhcm4oJ1tvbmUtZ3JpZF0gYXBwbHlUcmFuc2FjdGlvbjogYWRkVG9QYXJlbnRJZCBpcyBpZ25vcmVkIHVuZGVyIHJvdyBncm91cGluZyDigJQgZ3JvdXBzIGFyZSBzeW50aGV0aWMuIFJvd3Mgd2VyZSBhZGRlZCBhdCB0aGUgcm9vdC4nKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5LW9uLXdyaXRlIG92ZXIgdGhlIGdyaWQncyBvd24gY3VycmVudCByb3dzOiB0aGUgbm9kZSBncmFwaCBjYXJyaWVzXG4gICAgLy8gdGhlIGRhdGEsIHNvIHRoZSBob3N0J3Mgb3JpZ2luYWwgYXJyYXlzIGFyZSBuZXZlciBtdXRhdGVkIGFuZCB1bnRvdWNoZWRcbiAgICAvLyBicmFuY2hlcyBrZWVwIHRoZWlyIG9iamVjdCBpZGVudGl0eSBmb3IgdGhlIG5vZGUtcmV1c2UgcGF0aC5cbiAgICBjb25zdCBhcHBseVRvID0gKHJvd3M6IFRbXSk6IFRbXSA9PiByb3dzXG4gICAgICAuZmlsdGVyKGRhdGEgPT4gIXJlbW92ZUlkcy5oYXModGhpcy5yb3dTZXJ2aWNlLnJlc29sdmVSb3dJZChkYXRhKSkpXG4gICAgICAubWFwKGRhdGEgPT4ge1xuXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5yb3dTZXJ2aWNlLnJlc29sdmVSb3dJZChkYXRhKTtcblxuICAgICAgICBsZXQgbmV4dCA9IHVwZGF0ZXMuZ2V0KGlkKSA/PyBkYXRhO1xuXG4gICAgICAgIGlmICh0aGlzLnRyZWVEYXRhICYmIGNoaWxkcmVuRmllbGQpIHtcblxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKG5leHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NoaWxkcmVuRmllbGRdIGFzIFRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCByZWJ1aWx0ID0gY2hpbGRyZW4gPyBhcHBseVRvKGNoaWxkcmVuKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IHdpdGhBZGRlZCA9IGlkICE9IG51bGwgJiYgaWQgPT09IGFkZFRvUGFyZW50SWRcbiAgICAgICAgICAgID8gWy4uLihyZWJ1aWx0ID8/IFtdKSwgLi4uKHRyYW5zYWN0aW9uLmFkZCA/PyBbXSldXG4gICAgICAgICAgICA6IHJlYnVpbHQ7XG5cbiAgICAgICAgICBpZiAod2l0aEFkZGVkICE9PSBjaGlsZHJlbikgbmV4dCA9IHsgLi4ubmV4dCwgW2NoaWxkcmVuRmllbGRdOiB3aXRoQWRkZWQgPz8gW10gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50Um93cyA9IGdyb3VwaW5nXG4gICAgICA/IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUubGVhZikubWFwKG5vZGUgPT4gbm9kZS5kYXRhKVxuICAgICAgOiB0aGlzLl9yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiAhbm9kZS5wYXJlbnQpLm1hcChub2RlID0+IG5vZGUuZGF0YSk7XG5cbiAgICBsZXQgcm9vdHMgPSBhcHBseVRvKGN1cnJlbnRSb3dzKTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi5hZGQ/Lmxlbmd0aCAmJiAhYWRkVG9QYXJlbnRJZCkge1xuXG4gICAgICByb290cyA9IFsuLi5yb290cywgLi4udHJhbnNhY3Rpb24uYWRkXTtcbiAgICB9XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvb3RzLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZSByb3ctbG9hZGluZyBwYXRoLiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBkaWZmZXJlZCBvbmx5IGluXG4gICAqIHdoZXRoZXIgdGhleSBjbGVhcmVkIHRoZSBzdGF0ZSBzZXJ2aWNlcyBmaXJzdCwgc28gZXZlcnl0aGluZyBlbHNlIOKAlCBidWlsZCxcbiAgICogZmlsdGVyLCBwcnVuZSDigJQgbGl2ZXMgaGVyZSBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkUm93cyhyb3dEYXRhOiBUW10sIHJlc2V0U3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGlmIChyZXNldFN0YXRlKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gUm93IGdyb3VwaW5nIGlzIGEgdHJhbnNmb3JtIG9uIHRoZSB3YXkgaW46IHRoZSBob3N0IGtlZXBzIGhhbmRpbmcgdGhlXG4gICAgLy8gZ3JpZCBmbGF0IHJvd3MsIGFuZCB0aGUgdHJlZSBwaXBlbGluZSBiZWxvdyBzZWVzIHN5bnRoZXRpYyBncm91cCByb3dzXG4gICAgLy8gd2l0aCBjaGlsZHJlbiDigJQgdGhlIHNhbWUgc2hhcGUgdHJlZSBkYXRhIGFycml2ZXMgaW4uXG4gICAgaWYgKHRoaXMuX3Jvd0dyb3VwRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICByb3dEYXRhID0gYnVpbGRHcm91cGVkUm93cyhyb3dEYXRhLCB0aGlzLl9yb3dHcm91cEZpZWxkcywgdGhpcy5fYWdnQ29sdW1ucykgYXMgVFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0aGlzLmJ1aWxkUm93Tm9kZXMocm93RGF0YSwgbnVsbCwgMCwgdmFsaWRSb3dJZHMpO1xuXG4gICAgLy8gUHJ1bmUgQkVGT1JFIHNvcnRpbmcgYW5kIGZpbHRlcmluZzogYm90aCByZWFkIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIGFuZFxuICAgIC8vIHdpdGggdGhlIHBydW5lIGxhc3QsIGEgZGF0YSBzd2FwIHdoaWxlIGEgc29ydCB3YXMgYWN0aXZlIHJlc3VycmVjdGVkXG4gICAgLy8gdGhlIHJlbW92ZWQgcm93cyBpbnRvIGBfcm93Tm9kZXNgIGZvciBvbmUgd2hvbGUgcmVuZGVyIOKAlCB0aGUgb2xkIGFuZFxuICAgIC8vIHRoZSBuZXcgZGF0YXNldCBvbiBzY3JlZW4gdG9nZXRoZXIgdW50aWwgdGhlIG5leHQgcmVidWlsZC5cbiAgICB0aGlzLnBydW5lUmVtb3ZlZE5vZGVzKHZhbGlkUm93SWRzKTtcblxuICAgIC8vIFJlLWFwcGx5IHRoZSBhY3RpdmUgc29ydC4gYGJ1aWxkUm93Tm9kZXNgIHJlYnVpbGRzIHRoZSByb3cgbGlzdCBpbiB0aGVcbiAgICAvLyBvcmRlciB0aGUgZGF0YSBhcnJpdmVkLCBzbyB3aXRob3V0IHRoaXMgYSBkYXRhIHVwZGF0ZSBzaWxlbnRseSByZXR1cm5lZFxuICAgIC8vIHRoZSByb3dzIHRvIHRoYXQgb3JkZXIgd2hpbGUgYHNvcnRNb2RlbGAg4oCUIGFuZCB0aGVyZWZvcmUgdGhlIGhlYWRlcidzXG4gICAgLy8gc29ydCBhcnJvdyDigJQgc3RpbGwgc2FpZCB0aGV5IHdlcmUgc29ydGVkLiBTb3J0aW5nIGJlZm9yZSBmaWx0ZXJpbmdcbiAgICAvLyBiZWNhdXNlIGZpbHRlcmluZyBvbmx5IHNldHMgdmlzaWJpbGl0eSBvbiB3aGF0ZXZlciBvcmRlciB0aGlzIGxlYXZlcy5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA+IDApIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBCdWlsZCBSb3cgTm9kZXMgKE9wdGltaXplZClcbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dOb2RlcyhcbiAgICByb3dEYXRhOiBUW10sXG4gICAgcGFyZW50OiBPbmVSb3dOb2RlPFQ+IHwgbnVsbCA9IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlciA9IDAsXG4gICAgdmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAgIGV4cGFuZGVkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldEV4cGFuZGVkSWRzKCkpLFxuICAgIGNvbGxhcHNlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuZXhwYW5zaW9uU2VydmljZS5nZXRDb2xsYXBzZWRJZHMoKSksXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRJZHMoKSksXG4gICAgdmlzaXRlZERhdGE6IFNldDx1bmtub3duPiA9IG5ldyBTZXQoKVxuICApOiBPbmVSb3dOb2RlW10ge1xuXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFtdO1xuICAgICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXJvd0RhdGE/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIHJvd0RhdGEpIHtcblxuICAgICAgY29uc3Qgcm93SWQgPSB0aGlzLnJvd1NlcnZpY2UuZ2VuZXJhdGVSb3dJZChkYXRhLCB0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICAvLyBBIGN5Y2xlIGluIHRoZSBjaGlsZHJlbiBncmFwaCDigJQgYSByb3cgcmVhY2hhYmxlIGZyb20gaXRzIG93biBzdWJ0cmVlLFxuICAgICAgLy8gdGhlIGNsYXNzaWMgT1JNIGJhY2stcmVmZXJlbmNlIOKAlCB1c2VkIHRvIHJlY3Vyc2UgdW50aWwgdGhlIHN0YWNrIGJsZXcsXG4gICAgICAvLyBmcmVlemluZyB0aGUgYXBwOyBhbmQgd2l0aCBnZW5lcmF0ZWQgcm93IGlkcyBpdCBkaWQgc28gd2hpbGUgbWludGluZ1xuICAgICAgLy8gbm9kZXMgdGhlIHdob2xlIHdheSBkb3duLiBUaGUgc2FtZSBndWFyZCBhbHNvIGRyb3BzIGEgZHVwbGljYXRlIHJvdyBpZFxuICAgICAgLy8gKG9yIHRoZSBzYW1lIHJvdyBvYmplY3QgYXBwZWFyaW5nIHR3aWNlKTogZmlyc3Qgb2NjdXJyZW5jZSB3aW5zLlxuICAgICAgaWYgKHZpc2l0ZWREYXRhLmhhcyhkYXRhKSB8fCB2YWxpZFJvd0lkcy5oYXMocm93SWQpKSB7XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBbb25lLWdyaWRdIGN5Y2xpYyBvciBkdXBsaWNhdGUgcm93IChpZCBcIiR7cm93SWR9XCIpIOKAlCBza2lwcGVkLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMuIFRyZWUgZGF0YSBtdXN0IGJlIGFjeWNsaWMgYW5kIHJvdyBpZHMgdW5pcXVlLmApO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aXNpdGVkRGF0YS5hZGQoZGF0YSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGRhdGEgYXMgYW55KVt0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZF0gfHwgbnVsbDtcblxuICAgICAgbGV0IG5vZGU6IE9uZVJvd05vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIHZhbGlkUm93SWRzLmFkZChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhID0gZGF0YTtcbiAgICAgICAgbm9kZS5zZXRSb3dJbmRleCh0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUgPSBuZXcgT25lUm93Tm9kZTxUPihyb3dJZCwgZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgICAgbm9kZS5sZXZlbCA9IGxldmVsO1xuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgbm9kZS5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5zZXQocm93SWQsIG5vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FeGlzdCA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+PSAwO1xuXG4gICAgICAvLyBDb2VyY2VkLCBiZWNhdXNlIGBjaGlsZHJlbkV4aXN0YCBpcyBgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID49IDBgXG4gICAgICAvLyDigJQgd2hpY2ggaXMgYG51bGxgIGZvciBhIHJvdyB3aXRoIG5vIGNoaWxkcmVuIGZpZWxkLCBub3QgYGZhbHNlYC4gVGhlc2VcbiAgICAgIC8vIGFyZSBkZWNsYXJlZCBgYm9vbGVhbmAsIGFuZCBhc3NpZ25pbmcgbnVsbCBtYWRlIGV2ZXJ5IGNvbnN1bWVyIGNvbXBhcmVcbiAgICAgIC8vIHRydXRoaW5lc3MgaW5zdGVhZCBvZiB0aGUgdmFsdWUuXG4gICAgICBub2RlLmdyb3VwID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyBmYWxzZSA6ICEhY2hpbGRyZW5FeGlzdDtcbiAgICAgIG5vZGUubGVhZiA9IHRoaXMubWFzdGVyRGV0YWlsID8gdHJ1ZSA6ICFub2RlLmdyb3VwO1xuICAgICAgbm9kZS5sZWFmR3JvdXAgPSB0aGlzLm1hc3RlckRldGFpbCA/IGZhbHNlIDogKG5vZGUuZ3JvdXAgJiYgIWNoaWxkcmVuRXhpc3QpO1xuICAgICAgbm9kZS5leHBhbmRhYmxlID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogKG5vZGUuZ3JvdXAgJiYgIW5vZGUubGVhZkdyb3VwKTtcblxuICAgICAgY29uc3QgZGVmYXVsdEV4cGFuZGVkID0gbm9kZS5leHBhbmRhYmxlICYmIChsZXZlbCA8IHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgfHwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9PT0gLTEpO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkSWRzLmhhcyhyb3dJZCkgPyB0cnVlIDogY29sbGFwc2VkSWRzLmhhcyhyb3dJZCkgPyBmYWxzZSA6IGRlZmF1bHRFeHBhbmRlZCk7XG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkSWRzLmhhcyhyb3dJZCkpO1xuICAgICAgbm9kZS5zZXRDZWxsU3RhdGVzKHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGUpKTtcblxuICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsICYmIHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSh7IGRhdGEsIG5vZGU6IG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICB0aGlzLl9yb3dOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy50cmVlRGF0YSAmJiBjaGlsZHJlbkV4aXN0ID8gdGhpcy5idWlsZFJvd05vZGVzKGNoaWxkcmVuIHx8IFtdLCBub2RlLCBsZXZlbCArIDEsIHZhbGlkUm93SWRzLCBleHBhbmRlZElkcywgY29sbGFwc2VkSWRzLCBzZWxlY3RlZElkcywgdmlzaXRlZERhdGEpIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBGZWF0dXJlXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuXG4gICAgY29uc3QgcXVpY2sgPSB0aGlzLl9xdWlja0ZpbHRlclZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuXG4gICAgLy8gVGhlIGZpZWxkcyB0aGUgZ3JpZCBhY3R1YWxseSBzaG93cy4gV2l0aG91dCB0aGVtIHRoZSBxdWljayBmaWx0ZXIgZmFsbHNcbiAgICAvLyBiYWNrIHRvIGV2ZXJ5IHByb3BlcnR5IG9uIHRoZSByb3csIHdoaWNoIGxldHMgYSB1c2VyIG1hdGNoIG9uIGRhdGEgdGhhdFxuICAgIC8vIGhhcyBubyBjb2x1bW4gYW5kIG5ldmVyIGFwcGVhcnMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucXVpY2tGaWx0ZXJGaWVsZHMoKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBmaWx0ZXJUcmVlTm9kZShub2RlLCBmaWx0ZXJzLCBxdWljaywgZmllbGRzKSk7XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCBmaWVsZHMgdGhlIHF1aWNrIGZpbHRlciBzZWFyY2hlczogZXZlcnkgY29sdW1uIHRoYXQgaGFzIG9uZS5cbiAgICpcbiAgICogRW1wdHkgd2hpbGUgdGhlIGNvbHVtbnMgYXJlIHN0aWxsIGJlaW5nIHJlZ2lzdGVyZWQsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqIGhlbHBlciBmYWxscyBiYWNrIHRvIHNlYXJjaGluZyB0aGUgcm93IOKAlCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgYmVmb3JlLCBhbmRcbiAgICogdGhlIG9ubHkgc2Vuc2libGUgYW5zd2VyIHdoZW4gdGhlIGdyaWQgZG9lcyBub3QgeWV0IGtub3cgaXRzIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIHF1aWNrRmlsdGVyRmllbGRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2VcbiAgICAgIC5nZXRDb2x1bW5TdGF0ZSgpXG4gICAgICAuY29sdW1uc1xuICAgICAgLm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkIGFzIHN0cmluZylcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+ICEhZmllbGQgJiYgZmllbGQgIT09ICdfb25lUm93TnVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIFJvdyBOb2RlcyBEaXNwbGF5XG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hWaXNpYmxlTm9kZXMoZGlzcGF0Y2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB2aXNpYmxlTm9kZXM6IE9uZVJvd05vZGVbXSA9IFtdO1xuXG4gICAgbGV0IHJvd051bWJlciA9IDE7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9yb3dOb2Rlcykge1xuXG4gICAgICBjb25zdCBwYXJlbnRWaXNpYmxlID0gbm9kZS5wYXJlbnQgPyB2aXNpYmlsaXR5Q2FjaGUuZ2V0KG5vZGUucGFyZW50LnJvd0lkKSA6IHRydWU7XG5cbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IG5vZGUudmlzaWJsZSAmJiBwYXJlbnRWaXNpYmxlICYmICghbm9kZS5wYXJlbnQgfHwgbm9kZS5wYXJlbnQuZXhwYW5kZWQpO1xuXG4gICAgICB2aXNpYmlsaXR5Q2FjaGUuc2V0KG5vZGUucm93SWQsIGlzVmlzaWJsZSk7XG5cbiAgICAgIGlmIChpc1Zpc2libGUpIHtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXNbJ19vbmVSb3dOdW1iZXInXSA9IHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogcm93TnVtYmVyKysgfTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHZpc2libGVOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAnbm9uZScsIHZhbHVlOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gWy4uLnZpc2libGVOb2Rlc107XG5cbiAgICBpZiAoZGlzcGF0Y2gpIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd0RhdGFDaGFuZ2VkJywgeyBub2RlczogdmlzaWJsZU5vZGVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHJvd3MgYW5jaG9yZWQgdG8gb25lIGVkZ2Ugb2YgdGhlIGdyaWQuXG4gICAqXG4gICAqIFBpbm5lZCByb3dzIGFyZSBkZWxpYmVyYXRlbHkga2VwdCBvdXQgb2YgYHJvd05vZGVzYCBhbmRcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYDogdGhleSBhcmUgbm90IGRhdGEuIFNvcnRpbmcsIGZpbHRlcmluZywgc2VsZWN0aW9uLFxuICAgKiBleHBhbnNpb24sIHBhZ2luYXRpb24gYW5kIHRoZSB2aXNpYmxlIHJvdyBjb3VudCBhbGwgaWdub3JlIHRoZW0sIHdoaWNoIGlzXG4gICAqIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN1bW1hcnkgcm93LiBUaGV5IHJlbmRlciB3aXRoIHRoZSBzYW1lIGNvbHVtblxuICAgKiBkZWZpbml0aW9ucywgc28gcmVuZGVyZXJzIGFuZCB2YWx1ZSBnZXR0ZXJzIHdvcmsgYXMgdGhleSBkbyBldmVyeXdoZXJlXG4gICAqIGVsc2UuXG4gICAqL1xuICBwdWJsaWMgc2V0UGlubmVkUm93RGF0YShzaWRlOiBPbmVQaW5uZWRSb3dTaWRlLCByb3dEYXRhOiBUW10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSkgbm9kZS5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IChyb3dEYXRhID8/IFtdKS5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG5cbiAgICAgIC8vIElkcyBhcmUgbmFtZXNwYWNlZCBieSBzaWRlIGFuZCBwb3NpdGlvbi4gVGhleSBuZXZlciBjb2xsaWRlIHdpdGggYSBkYXRhXG4gICAgICAvLyByb3cncyBpZCwgYW5kIHRoZXkgYXJlIHN0YWJsZSBhY3Jvc3MgcmVidWlsZHMsIHdoaWNoIGtlZXBzIHRoZSByZW5kZXJlZFxuICAgICAgLy8gYGRhdGEtY2VsbC1pZGAgYXR0cmlidXRlcyBzdGFibGUgdG9vLlxuICAgICAgY29uc3Qgbm9kZSA9IG5ldyBPbmVSb3dOb2RlPFQ+KGBvbmUtcGlubmVkLSR7c2lkZX0tJHtpbmRleH1gLCBkYXRhLCBpbmRleCk7XG5cbiAgICAgIG5vZGUubGV2ZWwgPSAwO1xuICAgICAgbm9kZS5sZWFmID0gdHJ1ZTtcbiAgICAgIG5vZGUudmlzaWJsZSA9IHRydWU7XG4gICAgICBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywge1xuICAgICAgc2lkZSxcbiAgICAgIG5vZGVzOiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZS4gUmVhZC1vbmx5OyBjaGFuZ2UgdGhlbSB3aXRoIGBzZXRQaW5uZWRSb3dEYXRhYC4gKi9cbiAgcHVibGljIGdldFBpbm5lZFJvd05vZGVzKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUpOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyByZW9yZGVyaW5nXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqXG4gICAqIGBfb3JpZ2luYWxSb3dOb2Rlc2AgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3Igcm93IG9yZGVyOiBpdHMgaW5zZXJ0aW9uXG4gICAqIG9yZGVyIGlzIHdoYXQgYGFwcGx5U29ydGluZ2AgZmFsbHMgYmFjayB0byB3aGVuIHRoZSBzb3J0IG1vZGVsIGVtcHRpZXMsIGFuZFxuICAgKiB3aGF0IGEgcmVidWlsZCB3YWxrcy4gYF9yb3dOb2Rlc2AgaXMgb25seSB0aGUgY3VycmVudCBkaXNwbGF5IG9yZGVyLiBBIG1vdmVcbiAgICogdGhhdCB0b3VjaGVkIG9uZSBhbmQgbm90IHRoZSBvdGhlciB3b3VsZCBlaXRoZXIgYmUgdW5kb25lIGJ5IHRoZSBuZXh0IHNvcnRcbiAgICogY2hhbmdlIG9yIGludmlzaWJsZSB1bnRpbCBvbmUgaGFwcGVuZWQsIHNvIGJvdGggYXJlIHJld3JpdHRlbiB0b2dldGhlci5cbiAgICovXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRpc3BsYXllZCBvcmRlciBpcyB0aGUgZGF0YSBvcmRlciwgYW5kIHNvIHdoZXRoZXIgYSBtYW51YWwgbW92ZVxuICAgKiB3b3VsZCBzdXJ2aXZlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgcmVhc29uIHJlb3JkZXJpbmcgaXMgdW5hdmFpbGFibGUsIG9yIGBudWxsYCB3aGVuIGl0IGlzIGZpbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKTogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsIHtcblxuICAgIGlmICh0aGlzLnRyZWVEYXRhKSByZXR1cm4gJ3RyZWVEYXRhJztcblxuICAgIGlmICh0aGlzLl9zb3J0TW9kZWwubGVuZ3RoID4gMCkgcmV0dXJuICdzb3J0ZWQnO1xuXG4gICAgaWYgKGlzRmlsdGVyQWN0aXZlKHRoaXMuX2FjdGl2ZUZpbHRlcnMsIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPz8gJycpKSByZXR1cm4gJ2ZpbHRlcmVkJztcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIENvbnZlbmllbmNlIGludmVyc2Ugb2Yge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufS4gKi9cbiAgcHVibGljIGNhblJlb3JkZXJSb3dzKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKSA9PT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGZyb20gb25lIHBvc2l0aW9uIHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEluZGljZXMgYXJlIHBvc2l0aW9ucyBpbiB0aGUgZ3JpZCdzIHJvdyBvcmRlciwgdGhlIHNhbWUgb3JkZXJcbiAgICogYGdldEFsbFJvd05vZGVzKClgIHJldHVybnMuIGB0YXJnZXRJbmRleGAgaXMgd2hlcmUgdGhlIHJvdyBlbmRzIHVwICphZnRlcipcbiAgICogaXQgaGFzIGJlZW4gbGlmdGVkIG91dCBvZiBgc291cmNlSW5kZXhgIOKAlCBkcmFnZ2luZyByb3cgMCB0byB0aGUgYm90dG9tIG9mIGFcbiAgICogNS1yb3cgZ3JpZCBpcyBgbW92ZVJvdygwLCA0KWAsIG5vdCBgbW92ZVJvdygwLCA1KWAuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcm93cyBtb3ZlZC4gYGZhbHNlYCB3aGVuIHRoZSBtb3ZlIHdhcyByZWplY3RlZCDigJRcbiAgICogICAgICAgICAgb3V0LW9mLXJhbmdlIGluZGljZXMsIGEgbm8tb3AsIG9yIGFuIG9yZGVyIHRoZSBncmlkIGRvZXMgbm90IG93blxuICAgKiAgICAgICAgICAoc2VlIHtAbGluayBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbn0pIOKAlCBzbyBhIGNhbGxlciBjYW4gdGVsbCBhXG4gICAqICAgICAgICAgIHJlZnVzZWQgbW92ZSBmcm9tIGFuIGFwcGxpZWQgb25lLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3coc291cmNlSW5kZXg6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmNhblJlb3JkZXJSb3dzKCkpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG9yZGVyID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZUluZGV4KSB8fCAhTnVtYmVyLmlzSW50ZWdlcih0YXJnZXRJbmRleCkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChzb3VyY2VJbmRleCA8IDAgfHwgc291cmNlSW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IG9yZGVyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgW21vdmVkXSA9IG9yZGVyLnNwbGljZShzb3VyY2VJbmRleCwgMSk7XG5cbiAgICBvcmRlci5zcGxpY2UodGFyZ2V0SW5kZXgsIDAsIG1vdmVkKTtcblxuICAgIC8vIFJlYnVpbHQgcmF0aGVyIHRoYW4gbXV0YXRlZDogYSBNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciwgYW5kIHRoZXJlXG4gICAgLy8gaXMgbm8gd2F5IHRvIHJlcG9zaXRpb24gYSBrZXkgd2l0aGluIG9uZS5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzID0gbmV3IE1hcChvcmRlci5tYXAobm9kZSA9PiBbbm9kZS5yb3dJZCwgbm9kZV0pKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gb3JkZXI7XG5cbiAgICB0aGlzLnJlaW5kZXhSb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdyb3dPcmRlckNoYW5nZWQnLCB7IG5vZGVzOiB0aGlzLl92aXNpYmxlUm93Tm9kZXMgYXMgT25lUm93Tm9kZTxUPltdLCBub2RlOiBtb3ZlZCwgZnJvbUluZGV4OiBzb3VyY2VJbmRleCwgdG9JbmRleDogdGFyZ2V0SW5kZXggfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGlkZW50aWZpZWQgYnkgaWQuIENvbnZlbmllbnQgd2hlbiB0aGUgY2FsbGVyIGhvbGRzIGEgbm9kZSByYXRoZXJcbiAgICogdGhhbiBhIHBvc2l0aW9uIOKAlCB0aGUgaW5kZXggaXQgd2FzIGJ1aWx0IHdpdGggZ29lcyBzdGFsZSBhZnRlciBhbnkgbW92ZS5cbiAgICovXG4gIHB1YmxpYyBtb3ZlUm93QnlJZChyb3dJZDogc3RyaW5nLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBjb25zdCBzb3VyY2VJbmRleCA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSByb3dJZCk7XG5cbiAgICByZXR1cm4gc291cmNlSW5kZXggPT09IC0xID8gZmFsc2UgOiB0aGlzLm1vdmVSb3coc291cmNlSW5kZXgsIHRhcmdldEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zdGFtcCBgcm93SW5kZXhgIGZyb20gdGhlIGN1cnJlbnQgb3JkZXIuXG4gICAqXG4gICAqIFJvdyBpbmRleCBpcyBkZW5vcm1hbGlzZWQgb250byBldmVyeSBub2RlLCBhbmQgaGFsZiB0aGUgZ3JpZCByZWFkcyBpdCDigJRcbiAgICogY2VsbCBwYXJhbXMsIHRoZSByYW5nZSBzZWxlY3Rpb24sIHRoZSBkZXRhaWwgbG9va3VwLiBMZWF2aW5nIGl0IHN0YWxlIGFmdGVyXG4gICAqIGEgbW92ZSBwdXRzIGV2ZXJ5IHJvdyBiZWxvdyB0aGUgZHJvcCBwb2ludCBvbmUgb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWluZGV4Um93cygpOiB2b2lkIHtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiBub2RlLnNldFJvd0luZGV4KGluZGV4KSk7XG5cbiAgICAvLyBTaWxlbnQ6IHJvdyBudW1iZXJzIGFuZCB0aGUgdmlzaWJsZSBsaXN0IGhhdmUgdG8gYmUgcmVidWlsdCwgYnV0IHRoZVxuICAgIC8vIGByb3dEYXRhQ2hhbmdlZGAgdGhhdCBub3JtYWxseSBmb2xsb3dzIGRlZmVycyBhIGZyYW1lIGFuZCByZS1zZWVkcyBkZXRhaWxcbiAgICAvLyByb3dzLiBBIGtleWJvYXJkIGRyYWcgZmlyZXMgb25lIG9mIHRoZXNlIHBlciBhcnJvdyBrZXksIGFuZCBgbW92ZVJvd2BcbiAgICAvLyBhbm5vdW5jZXMgaXRzZWxmIHRocm91Z2ggYHJvd09yZGVyQ2hhbmdlZGAgaW5zdGVhZC5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldFZpc2libGVSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVSb3dOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0aW5nIE1vZGVsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBvblNvcnRDaGFuZ2VkKHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10pIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3NvcnRNb2RlbCA9IHNvcnRNb2RlbDtcblxuICAgIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzb3J0Q2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Jvd05vZGVzLCBzb3J0TW9kZWw6IHRoaXMuX3NvcnRNb2RlbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTb3J0aW5nKCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPT09IDApIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJhdG9yID0gKGE6IE9uZVJvd05vZGU8VD4sIGI6IE9uZVJvd05vZGU8VD4pOiBudW1iZXIgPT4ge1xuXG4gICAgICBmb3IgKGNvbnN0IHNvcnRJdGVtIG9mIHRoaXMuX3NvcnRNb2RlbCkge1xuXG4gICAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQgfSA9IHNvcnRJdGVtO1xuICAgICAgICBjb25zdCB2YWxBID0gZ2V0RmllbGRWYWx1ZShhLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHZhbEIgPSBnZXRGaWVsZFZhbHVlKGIuZGF0YSwgY29sSWQgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgY29tcGFyaXNvblJlc3VsdCA9IHRoaXMuY29tcGFyZVZhbHVlcyh2YWxBLCB2YWxCLCBzb3J0KTtcblxuICAgICAgICBpZiAoY29tcGFyaXNvblJlc3VsdCAhPT0gMCkge1xuXG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25SZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV0uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdHJlZSBzb3J0cyBzaWJsaW5ncyB3aXRoaW4gdGhlaXIgcGFyZW50LCBuZXZlciBhY3Jvc3MgaXQg4oCUIGEgZmxhdFxuICAgIC8vIHNvcnQgb2YgdGhlIHdob2xlIGxpc3QgaW50ZXJsZWF2ZWQgcGFyZW50cyB3aXRoIG90aGVyIHBhcmVudHMnIGNoaWxkcmVuXG4gICAgLy8gYW5kIHNjcmFtYmxlZCB0aGUgaGllcmFyY2h5LiBTb3J0aW5nIHRoZSBzaWJsaW5nIGFycmF5cyBhbmQgcmUtd2Fsa2luZ1xuICAgIC8vIGRlcHRoLWZpcnN0IGtlZXBzIGV2ZXJ5IHBhcmVudCBpbW1lZGlhdGVseSBhYm92ZSBpdHMgb3duIGNoaWxkcmVuLFxuICAgIC8vIHdoaWNoIGByZWZyZXNoVmlzaWJsZU5vZGVzYCBhbHNvIGRlcGVuZHMgb24gZm9yIGl0cyB2aXNpYmlsaXR5IGNhY2hlLlxuICAgIC8vIEdyb3VwIHJvd3MgY2FycnkgdGhlaXIgYWdncmVnYXRlcyBpbiBgZGF0YWAsIHNvIHNvcnRpbmcgYSBncm91cGVkIGdyaWRcbiAgICAvLyBvbiBhbiBhZ2dyZWdhdGVkIGNvbHVtbiBvcmRlcnMgdGhlIGdyb3VwcyBieSB0aGVpciBhZ2dyZWdhdGUuXG4gICAgY29uc3QgZmxhdHRlbmVkOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcblxuICAgIGNvbnN0IHdhbGsgPSAoc2libGluZ3M6IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSA9PiB7XG5cbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5zaWJsaW5nc10uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHNvcnRlZCkge1xuXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcblxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSB3YWxrKG5vZGUuY2hpbGRyZW4gYXMgT25lUm93Tm9kZTxUPltdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc29ydGVkO1xuICAgIH07XG5cbiAgICB3YWxrKFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maWx0ZXIobm9kZSA9PiAhbm9kZS5wYXJlbnQpKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gZmxhdHRlbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKHZhbEE6IGFueSwgdmFsQjogYW55LCBzb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyk6IG51bWJlciB7XG5cbiAgICAvLyBgdW5kZWZpbmVkYCBoYXMgdG8gYmUgdHJlYXRlZCBhcyBlbXB0eSBhbG9uZ3NpZGUgYG51bGxgOiBnZXRGaWVsZFZhbHVlXG4gICAgLy8gcmV0dXJucyB1bmRlZmluZWQgZm9yIGEgbWlzc2luZyBmaWVsZCBvciBhbiB1bnJlc29sdmVkIGRvdHRlZCBwYXRoLCBhbmRcbiAgICAvLyBjb21wYXJpbmcgdW5kZWZpbmVkIHdpdGggPCAvID4geWllbGRzIGZhbHNlIGJvdGggd2F5cywgd2hpY2ggbWFkZSBzdWNoXG4gICAgLy8gcm93cyBzZXR0bGUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhlIHNvcnQgaGFwcGVuZWQgdG8gZW5jb3VudGVyIHRoZW0uXG4gICAgY29uc3QgYUVtcHR5ID0gdmFsQSA9PT0gbnVsbCB8fCB2YWxBID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgYkVtcHR5ID0gdmFsQiA9PT0gbnVsbCB8fCB2YWxCID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYUVtcHR5ICYmIGJFbXB0eSkgcmV0dXJuIDA7XG4gICAgaWYgKGFFbXB0eSkgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIGlmIChiRW1wdHkpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcblxuICAgIGlmICh0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSB2YWxBLmxvY2FsZUNvbXBhcmUodmFsQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyBjb21wYXJpc29uIDogLWNvbXBhcmlzb247XG4gICAgfVxuXG4gICAgaWYgKHZhbEEgPCB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG4gICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogUm93IFNlbGVjdGlvbiBGZWF0dXJlIChPcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuXG4gICAgY29uc3Qgcm93SWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICByb3dJZHMucHVzaChub2RlLnJvd0lkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGwocm93SWRzKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IGFsbE5vZGVzTm90U2VsZWN0ZWQ6IGZhbHNlLCBhbGxOb2Rlc1NlbGVjdGVkOiB0cnVlLCBzZWxlY3RlZDogdHJ1ZSwgbm9kZTogbnVsbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdCBhbGwgbm9kZXMgKG9wdGltaXplZClcbiAgICovXG4gIHB1YmxpYyBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZChmYWxzZSk7XG5cbiAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RBbGwoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7XG4gICAgICAgIGFsbE5vZGVzTm90U2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGFsbE5vZGVzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIG5vZGU6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qgb3IgZGVzZWxlY3Qgb25lIHJvdywgaG9ub3VyaW5nIHRoZSBncmlkJ3Mgc2VsZWN0aW9uIG1vZGUuXG4gICAqXG4gICAqIFRoZSBtb2RlIHJ1bGUgdXNlZCB0byBsaXZlIGluIHRoZSBjaGVja2JveCBjb21wb25lbnQsIHdoaWNoIG1lYW50IHRoZSBvbmx5XG4gICAqIHdheSB0byBzZWxlY3QgYSByb3cgd2FzIHRvIGNsaWNrIHRoYXQgY2hlY2tib3gg4oCUIGFueXRoaW5nIGVsc2UgcmVhY2hpbmcgZm9yXG4gICAqIGB0b2dnbGVTZWxlY3Rpb25gIGdvdCBtdWx0aS1zZWxlY3QgYmVoYXZpb3VyIG9uIGEgc2luZ2xlLXNlbGVjdCBncmlkLiBJdFxuICAgKiBsaXZlcyBoZXJlIHNvIGV2ZXJ5IHBhdGggaW50byBzZWxlY3Rpb24gb2JleXMgdGhlIHNhbWUgcnVsZS5cbiAgICpcbiAgICogQHJldHVybnMgYGZhbHNlYCB3aGVuIHRoZSBncmlkIGhhcyBubyBzZWxlY3Rpb24gbW9kZSwgc28gYSBjYWxsZXIgY2FuIHRlbGxcbiAgICogICAgICAgICAgYSByZWZ1c2VkIHJlcXVlc3QgZnJvbSBhbiBhcHBsaWVkIG9uZS5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dTZWxlY3Rpb24ocm93SWQ6IHN0cmluZywgc2VsZWN0ZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIXRoaXMuX3Jvd1NlbGVjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBTaW5nbGUgc2VsZWN0IGlzIFwidGhpcyByb3cgYW5kIG5vIG90aGVyXCIsIHdoaWNoIG1lYW5zIGNsZWFyaW5nIGZpcnN0LlxuICAgIGlmICh0aGlzLl9yb3dTZWxlY3Rpb24gPT09ICdzaW5nbGUnKSB0aGlzLmRlc2VsZWN0QWxsKCk7XG5cbiAgICB0aGlzLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBldmVyeSByb3cgYmV0d2VlbiB0d28sIGluY2x1c2l2ZSwgaW4gZGlzcGxheSBvcmRlci5cbiAgICpcbiAgICogV2hhdCBhIHNoaWZ0LWV4dGVuZGVkIGtleWJvYXJkIHNlbGVjdGlvbiBuZWVkcy4gTXVsdGktc2VsZWN0IG9ubHkg4oCUIGFcbiAgICogc2luZ2xlLXNlbGVjdCBncmlkIGhhcyBubyBtZWFuaW5nZnVsIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdFJvd1JhbmdlKGZyb21Sb3dJZDogc3RyaW5nLCB0b1Jvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgdGhpcy5fcm93U2VsZWN0aW9uICE9PSAnbXVsdGlwbGUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBvcmRlciA9IHRoaXMuX3Zpc2libGVSb3dOb2Rlcy5sZW5ndGggPyB0aGlzLl92aXNpYmxlUm93Tm9kZXMgOiB0aGlzLl9yb3dOb2RlcztcblxuICAgIGNvbnN0IGZyb20gPSBvcmRlci5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSBmcm9tUm93SWQpO1xuICAgIGNvbnN0IHRvID0gb3JkZXIuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gdG9Sb3dJZCk7XG5cbiAgICBpZiAoZnJvbSA9PT0gLTEgfHwgdG8gPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBpZHMgPSBvcmRlclxuICAgICAgLnNsaWNlKE1hdGgubWluKGZyb20sIHRvKSwgTWF0aC5tYXgoZnJvbSwgdG8pICsgMSlcbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhpZHMsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSkge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIHNlbGVjdGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWQocm93SWQ6IHN0cmluZykge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb25Nb2RlKCkgPT09ICdzaW5nbGUnKSB7XG5cbiAgICAgICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHRydWUpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBzZWxlY3RlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWRCeUlkcyhyb3dJZHM6IHN0cmluZ1tdLCBzZWxlY3RlZDogYm9vbGVhbiA9IHRydWUpIHtcblxuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgaWYgKG5vZGUpIHtcblxuICAgICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICYgU2V0IEZ1bmN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEFsbFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM/Lmxlbmd0aCA+IDAgPyBbLi4udGhpcy5fcm93Tm9kZXNdIDogW107XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGF0YVNlbGVjdGVkKCk6IFRbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5zZWxlY3RlZCkubWFwKG5vZGUgPT4gKHsgLi4ubm9kZS5kYXRhIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUuc2VsZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+IDAgPyBbLi4ubm9kZXNdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1uIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJNb2RlbCgpOiBPbmVGaWx0ZXJNb2RlbFtdIHtcblxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldEZpbHRlck1vZGVsKG1vZGVsOiBPbmVGaWx0ZXJNb2RlbFtdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gbW9kZWw7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlckFjdGl2ZShmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycy5zb21lKGYgPT4gZi5maWVsZCA9PT0gZmllbGQgJiYgZi5jb25kaXRpb25zLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aWNrIGZpbHRlclxuICAgKi9cbiAgcHVibGljIHNldFF1aWNrRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSAodmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgY29sdW1uIHZhbGlkYXRvcnMgb3ZlciBvbmUgcm93LlxuICAgKlxuICAgKiBSdWxlcyBydW4gaW4gb3JkZXIgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IGZhaWx1cmUsIHNvIGEgZmllbGQgYXBwZWFycyBhdFxuICAgKiBtb3N0IG9uY2UuIEZpZWxkcyB0aGF0IHBhc3NlZCBhcmUgYWJzZW50IHJhdGhlciB0aGFuIG1hcHBlZCB0byBgbnVsbGAuXG4gICAqXG4gICAqIFRoZSByb3cgdHlwZSBjb21lcyBmcm9tIHRoZSBncmlkJ3Mgb3duIGBUYCDigJQgdGhpcyB1c2VkIHRvIGRlY2xhcmUgaXRzIG93blxuICAgKiBgPFQ+YCwgd2hpY2ggc2hhZG93ZWQgdGhlIGNsYXNzIHBhcmFtZXRlciBhbmQgbGV0IGFuIGBPbmVHcmlkQXBpPEVtcGxveWVlPmBcbiAgICogaGFwcGlseSB2YWxpZGF0ZSBhbiB1bnJlbGF0ZWQgc2hhcGUgYWdhaW5zdCBlbXBsb3llZSBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlUm93KHJvdzogVCwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzPFQ+IHtcblxuICAgIGNvbnN0IGVycm9yczogT25lUm93VmFsaWRhdGlvbkVycm9yczxUPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXG4gICAgICAvLyBBIGNvbHVtbiBjYW4gb25seSBjb250cmlidXRlIGFuIGVycm9yIGlmIGl0IGhhcyBib3RoIHJ1bGVzIGFuZCBhIGZpZWxkXG4gICAgICAvLyB0byBrZXkgdGhlbSB1bmRlci5cbiAgICAgIGlmICghY29sdW1uLmZpZWxkIHx8ICFjb2x1bW4udmFsaWRhdGlvblJ1bGVzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY29sdW1uLnZhbGlkYXRpb25SdWxlcykge1xuXG4gICAgICAgIGNvbnN0IGVycm9yID0gcnVsZShyb3dbY29sdW1uLmZpZWxkXSwgcm93KTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcblxuICAgICAgICAgIGVycm9yc1tjb2x1bW4uZmllbGRdID0gZXJyb3I7XG5cbiAgICAgICAgICBicmVhazsgLy8gZmlyc3QgZmFpbHVyZSBwZXIgY29sdW1uIHdpbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBjb2x1bW4gdmFsaWRhdG9ycyBvdmVyIGEgd2hvbGUgZGF0YXNldC5cbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIGB2YWxpZGF0ZVJvd2Agc28gdGhlIHR3byBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBjb3VudHNcbiAgICogYXMgaW52YWxpZCDigJQgdGhleSBwcmV2aW91c2x5IGNhcnJpZWQgc2VwYXJhdGUgY29waWVzIG9mIHRoZSBzYW1lIGxvb3AuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVBbGxSb3dzKHJvd0RhdGE6IFRbXSwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVWYWxpZGF0aW9uUmVzdWx0PFQ+IHtcblxuICAgIGNvbnN0IGFsbEVycm9ycyA9IHJvd0RhdGEubWFwKHJvdyA9PiB0aGlzLnZhbGlkYXRlUm93KHJvdywgY29sdW1ucykpO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID0gYWxsRXJyb3JzLnNvbWUoZXJyb3JzID0+IE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4geyBlcnJvcnM6IGFsbEVycm9ycywgdmFsaWQ6ICFoYXNFcnJvcnMsIGludmFsaWQ6IGhhc0Vycm9ycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIGV2ZXJ5IG5vZGUsIGRlcHRoLWZpcnN0LCBvbmNlIGVhY2guXG4gICAqXG4gICAqIGByb3dOb2Rlc2AgaXMgYWxyZWFkeSB0aGUgZmxhdHRlbmVkIHRyZWUg4oCUIGBidWlsZFJvd05vZGVzYCBwdXNoZXMgZXZlcnlcbiAgICogbm9kZSBpbnRvIGl0IGFzIGl0IGRlc2NlbmRzIOKAlCBzbyB3YWxraW5nIGl0IGlzIHRoZSB3aG9sZSB0cmF2ZXJzYWwuIFRoZVxuICAgKiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB3YWxrZWQgdGhhdCBmbGF0IGxpc3QgKmFuZCogcmVjdXJzZWQgaW50b1xuICAgKiBgY2hpbGRyZW5gLCB2aXNpdGluZyBldmVyeSBuZXN0ZWQgbm9kZSB0d2ljZSBhbmQgZXZlcnkgZGVwdGgtMyBub2RlIHRocmVlXG4gICAqIHRpbWVzLiBgaW5kZXhgIGlzIHRoZSBub2RlJ3MgcG9zaXRpb24gaW4gdGhlIGZsYXR0ZW5lZCBvcmRlciwgbWF0Y2hpbmdcbiAgICogYG5vZGUucm93SW5kZXhgLCByYXRoZXIgdGhhbiBpdHMgcG9zaXRpb24gYW1vbmcgaXRzIHNpYmxpbmdzLlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hOb2RlKGNhbGxiYWNrOiAobm9kZTogT25lUm93Tm9kZTxUPiwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IGNhbGxiYWNrKG5vZGUsIGluZGV4KSk7XG4gIH1cblxuICAvKiogVHJhdmVyc2Ugb25seSBsZWFmIG5vZGVzLCBvbmNlIGVhY2gsIGluIGZsYXR0ZW5lZCBvcmRlci4gKi9cbiAgcHVibGljIGZvckVhY2hMZWFmTm9kZShjYWxsYmFjazogKG5vZGU6IE9uZVJvd05vZGU8VD4sIGluZGV4OiBudW1iZXIpID0+IHZvaWQpIHtcblxuICAgIGxldCBsZWFmSW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGlmIChub2RlLmxlYWYpIGNhbGxiYWNrKG5vZGUsIGxlYWZJbmRleCsrKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93Tm9kZUJ5SWQocm93SWQ6IHN0cmluZyk6IE9uZVJvd05vZGU8VD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvY29sbGFwc2UgYSBub2RlXG4gICAqL1xuICBwdWJsaWMgc2V0VHJlZURhdGFDaGlsZHJlbkZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZmllbGQ7XG4gIH1cblxuICBwdWJsaWMgc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQoZGVmYXVsdEV4cGFuZGVkOiBudW1iZXIpIHtcblxuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSBkZWZhdWx0RXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5zaW9uIHN0YXRlIGxpdmVzIGluIHR3byBwbGFjZXMsIGFuZCB0aGV5IGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLlxuICAgKlxuICAgKiBgT25lR3JpZEV4cGFuc2lvblNlcnZpY2VgIHJlY29yZHMgb25seSAqZGVsaWJlcmF0ZSogY2hhbmdlcyDigJQgYSBjbGljaywgb3JcbiAgICogb25lIG9mIHRoZSBtZXRob2RzIGJlbG93LiBJdCBpcyBhbiBvdmVycmlkZSBsYXllcjogYGJ1aWxkUm93Tm9kZXNgIGNvbnN1bHRzXG4gICAqIGl0IGZpcnN0IGFuZCBmYWxscyBiYWNrIHRvIGBncm91cERlZmF1bHRFeHBhbmRlZGAgZm9yIGV2ZXJ5IHJvdyB0aGUgdXNlclxuICAgKiBoYXMgbm90IHRvdWNoZWQuIFRoYXQgaXMgd2hhdCBsZXRzIGEgbGF0ZXIgYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBjaGFuZ2VcbiAgICogdGFrZSBlZmZlY3QsIGFuZCB3aGF0IGxldHMgYSBjb2xsYXBzZSBzdXJ2aXZlIGEgcmVidWlsZC5cbiAgICpcbiAgICogYG5vZGUuZXhwYW5kZWRgIGlzIHRoZSByZXNvbHZlZCB0cnV0aCBmb3IgYSByb3csIGRlZmF1bHRzIGluY2x1ZGVkLiBQdWJsaWNcbiAgICogcmVhZHMgcmVwb3J0IHRoYXQ7IHRoZSBvdmVycmlkZSBzZXRzIHN0YXkgaW50ZXJuYWwuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdGhlIHNldHRlcnMgYmVsb3cgbWFpbnRhaW46IGBleHBhbmRlZGAgaXMgb25seSBldmVyIHRydWUgZm9yXG4gICAqIGEgbm9kZSB0aGF0IGNhbiBleHBhbmQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlRXhwYW5kQWxsKGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICB0aGlzLmZvckVhY2hOb2RlKG5vZGUgPT4ge1xuXG4gICAgICBpZiAoIW5vZGUuZXhwYW5kYWJsZSkgcmV0dXJuO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKG5vZGUucm93SWQsIGV4cGFuZGVkKVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5kZWRCeUlkKHJvd0lkOiBzdHJpbmcsIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgaWYgKG5vZGU/LmV4cGFuZGFibGUpIHtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChyb3dJZCwgZXhwYW5kZWQpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIGlmIChyb3dJZHMgJiYgcm93SWRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgZm9yIChsZXQgcm93SWQgb2Ygcm93SWRzKSB7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgICBpZiAobm9kZT8uZXhwYW5kYWJsZSkge1xuXG4gICAgICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgY3VycmVudGx5IGV4cGFuZGVkIHJvdywgaW4gdHJlZSBvcmRlci5cbiAgICpcbiAgICogRGVyaXZlZCBmcm9tIHRoZSBub2RlcyByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgb3ZlcnJpZGUgcmVjb3JkLCBzbyByb3dzXG4gICAqIG9wZW5lZCBieSBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGFyZSBpbmNsdWRlZCDigJQgcHJldmlvdXNseSB0aGlzIHJldHVybmVkXG4gICAqIG9ubHkgcm93cyBzb21lb25lIGhhZCBleHBsaWNpdGx5IHRvZ2dsZWQsIGFuZCBjYW1lIGJhY2sgZW1wdHkgb24gZmlyc3QgbG9hZFxuICAgKiB3aGlsZSB0aGUgZmlyc3QgbGV2ZWwgd2FzIHZpc2libHkgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBhbmRlZEJ5SWRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dOb2Rlc1xuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS5leHBhbmRhYmxlICYmIG5vZGUuZXhwYW5kZWQpXG5cbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBzZXREZXRhaWxSb3dEYXRhKG5vZGU6IE9uZVJvd05vZGU8VD4sIGRldGFpbERhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0R2V0RGV0YWlsUm93RGF0YShnZXREZXRhaWxSb3dEYXRhOiAocGFyYW1zOiBPbmVHZXREZXRhaWxSb3dEYXRhUGFyYW1zKSA9PiB2b2lkKSB7XG5cbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gZ2V0RGV0YWlsUm93RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIFN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2Uuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLl9jb250ZXh0KTtcblxuICAgIC8vIENlbGwgc3RhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb2x1bW5zLCBzbyByZXBsYWNpbmcgdGhlbSB3aG9sZXNhbGVcbiAgICAvLyBzdGFsZXMgZXZlcnkgbm9kZSBidWlsdCBiZWZvcmUgdGhpcyByYW4uIFRyZWUgYW5kIGdyb3VwaW5nIG1vZGUgaGl0XG4gICAgLy8gdGhpcyBvbiBldmVyeSBsb2FkOiB0aGUgZ3JvdXAgY29sdW1uIHJlZ2lzdGVycyBmcm9tIGEgZGVmZXJyZWRcbiAgICAvLyBzZXRDb2x1bW5EZWZzLCBhZnRlciB0aGUgaG9zdCBoYXMgdHlwaWNhbGx5IGFscmVhZHkgbG9hZGVkIHJvd3Mg4oCUXG4gICAgLy8gaG9zdHMgdXNlZCB0byBoYXZlIHRvIGRlZmVyIHNldFJvd0RhdGEgdGhlbXNlbHZlcyB0byBkb2RnZSBpdC5cbiAgICB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbihpZDogc3RyaW5nLCBjaGFuZ2VzOiBQYXJ0aWFsPE9uZUNvbHVtbkRlZjxUPj4pOiB2b2lkIHtcblxuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMudmlzaWJsZUNvbHVtbkZpZWxkcygpO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnVwZGF0ZUNvbHVtbkRlZihpZCwgY2hhbmdlcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBPbmx5IHdoZW4gdGhlIHNldCBvZiB2aXNpYmxlIGNvbHVtbnMgY2hhbmdlZCAoYSBoaWRlLCBhIHNob3cpOiBhIGNlbGxcbiAgICAvLyBzdGF0ZSBjYW4gYXBwZWFyIG9yIGRpc2FwcGVhciB0aGVuLiBXaWR0aCBwYXRjaGVzIOKAlCB0aGlzIG1ldGhvZCBydW5zXG4gICAgLy8gcGVyIG1vdXNlbW92ZSBkdXJpbmcgYSByZXNpemUg4oCUIHNraXAgdGhlIE8ocm93cyDDlyBjb2x1bW5zKSBwYXNzLlxuICAgIGlmICh0aGlzLnZpc2libGVDb2x1bW5GaWVsZHMoKSAhPT0gYmVmb3JlKSB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXNpYmxlIGZpZWxkcyBhcyBvbmUgY29tcGFyYWJsZSBrZXkuICovXG4gIHByaXZhdGUgdmlzaWJsZUNvbHVtbkZpZWxkcygpOiBzdHJpbmcge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnM/Lm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkKS5qb2luKCd8JykgPz8gJyc7XG4gIH1cblxuICAvKiogUmVjb21wdXRlIGV2ZXJ5IG5vZGUncyBjZWxsIHN0YXRlcyBhZ2FpbnN0IHRoZSBjdXJyZW50IGNvbHVtbnMuICovXG4gIHByaXZhdGUgcmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTogdm9pZCB7XG5cbiAgICBjb25zdCByZWZyZXNoID0gKG5vZGU6IE9uZVJvd05vZGUpID0+IG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICB0aGlzLl9yb3dOb2Rlcy5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLnRvcC5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLmJvdHRvbS5mb3JFYWNoKHJlZnJlc2gpO1xuICB9XG5cbiAgcHVibGljIHJlb3JkZXJDb2x1bW5EZWZzKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5yZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUm93IGdyb3VwaW5nXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgX3Jvd0dyb3VwRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9hZ2dDb2x1bW5zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdO1xuXG4gIC8qKiBUaGUgZmllbGRzIHRoZSByb3dzIGFyZSBncm91cGVkIGJ5LCBpbiBuZXN0aW5nIG9yZGVyLiBFbXB0eSB3aGVuIG9mZi4gKi9cbiAgcHVibGljIGdldCByb3dHcm91cEZpZWxkcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93R3JvdXBGaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogVHVybiByb3cgZ3JvdXBpbmcgb24uIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgd2hlbiBjb2x1bW5cbiAgICogZGVmaW5pdGlvbnMgZGVjbGFyZSBgcm93R3JvdXBgOyB0aGUgZ3JpZCB0aGVuIGJlaGF2ZXMgYXMgYSB0cmVlIG92ZXJcbiAgICogc3ludGhldGljIGdyb3VwIHJvd3MsIGFuZCBgc2V0Um93RGF0YWAgLyBgdXBkYXRlUm93RGF0YWAga2VlcCB0YWtpbmcgdGhlXG4gICAqIGZsYXQgcm93cyB0aGV5IGFsd2F5cyB0b29rLlxuICAgKi9cbiAgcHVibGljIHNldFJvd0dyb3VwaW5nKGdyb3VwRmllbGRzOiBzdHJpbmdbXSwgYWdncmVnYXRpb25zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdKTogdm9pZCB7XG5cbiAgICB0aGlzLl9yb3dHcm91cEZpZWxkcyA9IGdyb3VwRmllbGRzID8/IFtdO1xuICAgIHRoaXMuX2FnZ0NvbHVtbnMgPSBhZ2dyZWdhdGlvbnMgPz8gW107XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVW5kbyAvIHJlZG8gb2YgY2VsbCBlZGl0c1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF91bmRvTGltaXQgPSAwO1xuICBwcml2YXRlIF91bmRvU3RhY2s6IHsgcm93SWQ6IHN0cmluZzsgZmllbGQ6IHN0cmluZzsgb2xkVmFsdWU6IGFueTsgbmV3VmFsdWU6IGFueSB9W10gPSBbXTtcbiAgcHJpdmF0ZSBfcmVkb1N0YWNrOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBjb21taXR0ZWQgY2VsbCBlZGl0cyBmb3IgdW5kby9yZWRvLiBDYWxsZWQgYnlcbiAgICogYE9uZUdyaWRDb21wb25lbnRgIGZyb20gYFt1bmRvUmVkb0NlbGxFZGl0aW5nXWA7IHRoZSBzdGFjayBrZWVwcyB0aGUgbGFzdFxuICAgKiBgbGltaXRgIGVkaXRzLiBQcm9ncmFtbWF0aWMgYHNldERhdGFWYWx1ZWAgd3JpdGVzIGFyZSBub3QgcmVjb3JkZWQg4oCUIG9ubHlcbiAgICogY29tbWl0cywgdGhlIG9uZXMgdGhhdCByYWlzZSBgY2VsbFZhbHVlQ2hhbmdlZGAgd2l0aG91dCBhIHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBlbmFibGVVbmRvUmVkb0NlbGxFZGl0aW5nKGxpbWl0OiBudW1iZXIgPSAxMCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3VuZG9MaW1pdCA+IDApIHJldHVybjtcblxuICAgIHRoaXMuX3VuZG9MaW1pdCA9IE1hdGgubWF4KE1hdGguZmxvb3IobGltaXQpLCAxKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NlbGxWYWx1ZUNoYW5nZWQnLCAoZXZlbnQ6IENlbGxWYWx1ZUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICBpZiAoZXZlbnQuc291cmNlKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3VuZG9TdGFjay5wdXNoKHsgcm93SWQ6IGV2ZW50Lm5vZGUucm93SWQsIGZpZWxkOiBldmVudC5maWVsZCwgb2xkVmFsdWU6IGV2ZW50Lm9sZFZhbHVlLCBuZXdWYWx1ZTogZXZlbnQubmV3VmFsdWUgfSk7XG5cbiAgICAgIGlmICh0aGlzLl91bmRvU3RhY2subGVuZ3RoID4gdGhpcy5fdW5kb0xpbWl0KSB0aGlzLl91bmRvU3RhY2suc2hpZnQoKTtcblxuICAgICAgLy8gQSBuZXcgZWRpdCBmb3JrcyBoaXN0b3J5OyB3aGF0IHdhcyB1bmRvbmUgY2FuIG5vIGxvbmdlciBiZSByZWRvbmUuXG4gICAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXZlcnQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdHRlZCBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyB1bmRvbmUuICovXG4gIHB1YmxpYyB1bmRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3VuZG9TdGFjaywgdGhpcy5fcmVkb1N0YWNrLCAndW5kbycpO1xuICB9XG5cbiAgLyoqIFJlLWFwcGx5IHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyByZWRvbmUuICovXG4gIHB1YmxpYyByZWRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3JlZG9TdGFjaywgdGhpcy5fdW5kb1N0YWNrLCAncmVkbycpO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRVbmRvU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3VuZG9TdGFjay5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFJlZG9TaXplKCk6IG51bWJlciB7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVkb1N0YWNrLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGF5RWRpdChcbiAgICBmcm9tOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHRvOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHNvdXJjZTogJ3VuZG8nIHwgJ3JlZG8nLFxuICApOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGVkaXQgPSBmcm9tLnBvcCgpO1xuXG4gICAgaWYgKCFlZGl0KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChlZGl0LnJvd0lkKTtcblxuICAgIC8vIFRoZSByb3cgY2FuIGJlIGdvbmUg4oCUIGEgc2V0Um93RGF0YSByZXBsYWNlZCB0aGUgZGF0YSB1bmRlciB0aGUgc3RhY2suXG4gICAgLy8gVGhlIGVkaXQgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiByZXBsYXllZCBvbnRvIG5vdGhpbmcuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZSA9PT0gJ3VuZG8nID8gZWRpdC5vbGRWYWx1ZSA6IGVkaXQubmV3VmFsdWU7XG4gICAgY29uc3QgcHJldmlvdXMgPSBzb3VyY2UgPT09ICd1bmRvJyA/IGVkaXQubmV3VmFsdWUgOiBlZGl0Lm9sZFZhbHVlO1xuXG4gICAgKG5vZGUuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbZWRpdC5maWVsZF0gPSB2YWx1ZTtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcblxuICAgIHRvLnB1c2goZWRpdCk7XG5cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zPy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGVkaXQuZmllbGQpID8/IG51bGw7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsVmFsdWVDaGFuZ2VkJywge1xuICAgICAgbm9kZSxcbiAgICAgIGRhdGE6IG5vZGUuZGF0YSxcbiAgICAgIGNvbHVtbjogY29sdW1uIGFzIE9uZUNvbHVtbkRlZjxUPixcbiAgICAgIGZpZWxkOiBlZGl0LmZpZWxkLFxuICAgICAgb2xkVmFsdWU6IHByZXZpb3VzLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlLFxuICAgICAgc291cmNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ2xpZW50LXNpZGUgcGFnaW5hdGlvblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9jbGllbnRQYWdpbmF0aW9uID0gZmFsc2U7XG4gIHByaXZhdGUgX3BhZ2VTaXplID0gMjU7XG4gIHByaXZhdGUgX2N1cnJlbnRQYWdlID0gMTtcblxuICAvKiogVGhlIHBhZ2luZyBzdGF0ZSwgd2hlbiB0aGUgZ3JpZCBwYWdlcyBpdHMgb3duIHJvd3MuICovXG4gIHB1YmxpYyBnZXQgcGFnaW5hdGlvblN0YXRlKCk6IFJlYWRvbmx5PHsgZW5hYmxlZDogYm9vbGVhbjsgcGFnZVNpemU6IG51bWJlcjsgY3VycmVudFBhZ2U6IG51bWJlciB9PiB7XG5cbiAgICByZXR1cm4geyBlbmFibGVkOiB0aGlzLl9jbGllbnRQYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5fcGFnZVNpemUsIGN1cnJlbnRQYWdlOiB0aGlzLl9jdXJyZW50UGFnZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gZ3JpZC1vd25lZCBwYWdpbmcgb24gb3Igb2ZmLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIGZyb20gaXRzXG4gICAqIGBjbGllbnRTaWRlUGFnaW5hdGlvbmAgaW5wdXQ7IHRoZSBkaXNwbGF5IHNsaWNlIGlzIHdoYXQgY2hhbmdlcyDigJQgdGhlXG4gICAqIGZ1bGwgZGF0YXNldCBzdGF5cyBiZWhpbmQgdGhlIEFQSSAoc2VsZWN0aW9uLCBmaWx0ZXJzIGFuZCBzb3J0aW5nIGtlZXBcbiAgICogb3BlcmF0aW5nIG9uIGFsbCBvZiBpdCkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q2xpZW50U2lkZVBhZ2luYXRpb24oZW5hYmxlZDogYm9vbGVhbiwgcGFnZVNpemU/OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuX2NsaWVudFBhZ2luYXRpb24gPSBlbmFibGVkO1xuXG4gICAgaWYgKHBhZ2VTaXplICYmIHBhZ2VTaXplID4gMCkgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcbiAgfVxuXG4gIC8qKiBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBhbmQgcmV0dXJuIHRvIHRoZSBmaXJzdCBwYWdlLiAqL1xuICBwdWJsaWMgc2V0UGFnZVNpemUocGFnZVNpemU6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCB8fCAhKHBhZ2VTaXplID4gMCkpIHJldHVybjtcblxuICAgIHRoaXMuX3BhZ2VTaXplID0gTWF0aC5mbG9vcihwYWdlU2l6ZSk7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSAxO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRvIGEgcGFnZSAoMS1iYXNlZCkuIENsYW1wZWQgdG8gYXQgbGVhc3QgMTsgdGhlIHRvcCBlbmQgY2xhbXBzIHdoZW4gdGhlIHNsaWNlIGlzIHRha2VuLiAqL1xuICBwdWJsaWMgc2V0Q3VycmVudFBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1heChNYXRoLmZsb29yKHBhZ2UpLCAxKTtcblxuICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2N1cnJlbnRQYWdlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHRhcmdldDtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNsaWNlIG9mIHJvd3MgdGhlIGN1cnJlbnQgcGFnZSBzaG93cyDigJQgYSBwYXNzdGhyb3VnaCB3aGlsZSBwYWdpbmcgaXNcbiAgICogb2ZmLiBUaGUgYm9keSByb3V0ZXMgaXRzIHJlbmRlciBsaXN0IHRocm91Z2ggaGVyZSwgYWZ0ZXIgcmVwb3J0aW5nIHRoZVxuICAgKiBmdWxsIGNvdW50LCBzbyBgcm93Q291bnRDaGFuZ2VkYCBrZWVwcyBtZWFuaW5nIFwicm93cyBhZnRlciBmaWx0ZXJpbmdcIlxuICAgKiB3aGV0aGVyIG9yIG5vdCB0aGUgZ3JpZCBwYWdlcy5cbiAgICovXG4gIHB1YmxpYyBwYWdlTm9kZXMobm9kZXM6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudFBhZ2luYXRpb24pIHJldHVybiAobm9kZXMgPz8gW10pIGFzIE9uZVJvd05vZGU8VD5bXTtcblxuICAgIGNvbnN0IGxhc3RQYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKChub2Rlcz8ubGVuZ3RoID8/IDApIC8gdGhpcy5fcGFnZVNpemUpLCAxKTtcblxuICAgIC8vIEEgc2hyaW5raW5nIGRhdGFzZXQgKGEgZmlsdGVyLCBhIGRlbGV0ZSkgY2FuIHN0cmFuZCB0aGUgcGFnZSBwYXN0IHRoZVxuICAgIC8vIGVuZDsgY2xhbXBpbmcgaGVyZSBzaG93cyB0aGUgbGFzdCBwYWdlIGluc3RlYWQgb2YgYW4gZW1wdHkgb25lLlxuICAgIGlmICh0aGlzLl9jdXJyZW50UGFnZSA+IGxhc3RQYWdlKSB0aGlzLl9jdXJyZW50UGFnZSA9IGxhc3RQYWdlO1xuXG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuX3BhZ2VTaXplO1xuXG4gICAgcmV0dXJuIChub2RlcyA/PyBbXSkuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5fcGFnZVNpemUpIGFzIE9uZVJvd05vZGU8VD5bXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaXplIHRoZSBmbGV4IGNvbHVtbnMgaW50byB0aGUgZ2l2ZW4gd2lkdGguXG4gICAqXG4gICAqIENhbGxlZCBieSB0aGUgZ3JpZCBib2R5IHdpdGggaXRzIG93biB2aWV3cG9ydCB3aWR0aCDigJQgb24gZmlyc3QgcmVuZGVyLCBvblxuICAgKiBjb250YWluZXIgcmVzaXplIGFuZCBhZnRlciBjb2x1bW4gY2hhbmdlcyDigJQgc28gYGNvbHVtbkRlZi5mbGV4YCB3b3Jrc1xuICAgKiB3aXRob3V0IHRoZSBob3N0IGRvaW5nIGFueXRoaW5nLiBBbHNvIGNhbGxhYmxlIGRpcmVjdGx5IHdpdGggYW55IHdpZHRoLlxuICAgKiBBIG5vLW9wIHdoZW4gbm8gdmlzaWJsZSBjb2x1bW4gZGVjbGFyZXMgYGZsZXhgIG9yIG5vdGhpbmcgd291bGQgY2hhbmdlLlxuICAgKi9cbiAgcHVibGljIGFwcGx5RmxleFdpZHRocyhhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuY29sdW1uU2VydmljZS5hcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGdyaWQgYXMgQ1NWOiB2aXNpYmxlIGNvbHVtbnMgaW4gZGlzcGxheSBvcmRlciwgdmlzaWJsZSByb3dzXG4gICAqIGluIGN1cnJlbnQgc29ydCBvcmRlciwgdmFsdWVzIHRocm91Z2ggdGhlIHNhbWUgZ2V0dGVyL2Zvcm1hdHRlciBwaXBlbGluZVxuICAgKiB0aGUgY2VsbHMgcmVuZGVyIHdpdGguIFBpbm5lZCByb3dzIGFuZCBkZXRhaWwgZ3JpZHMgYXJlIG5vdCBkYXRhIGFuZCBhcmVcbiAgICogbm90IGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGdldERhdGFBc0NzdihvcHRpb25zOiBPbmVDc3ZFeHBvcnRPcHRpb25zID0ge30pOiBzdHJpbmcge1xuXG4gICAgY29uc3Qgbm9kZXMgPSBvcHRpb25zLm9ubHlTZWxlY3RlZCA/IHRoaXMuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpIDogdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuXG4gICAgcmV0dXJuIGJ1aWxkQ3N2KG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXSwgdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucyBhcyBPbmVDb2x1bW5EZWY8VD5bXSwgdGhpcy5fY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIENTViBhbmQgaGFuZCBpdCB0byB0aGUgYnJvd3NlciBhcyBhIGRvd25sb2FkLiAqL1xuICBwdWJsaWMgZXhwb3J0RGF0YUFzQ3N2KG9wdGlvbnM6IE9uZUNzdkV4cG9ydE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5nZXREYXRhQXNDc3Yob3B0aW9ucyldLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG5cbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBsaW5rLmRvd25sb2FkID0gb3B0aW9ucy5maWxlTmFtZSA/PyAnZXhwb3J0LmNzdic7XG4gICAgbGluay5jbGljaygpO1xuXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChsaW5rLmhyZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgb3IgaGlkZSBvbmUgY29sdW1uLiBBIGhpZGRlbiBjb2x1bW4ga2VlcHMgaXRzIG9yZGVyLCB3aWR0aCBhbmQgcGluLFxuICAgKiBzbyBzaG93aW5nIGl0IGFnYWluIHJlc3RvcmVzIGl0IGV4YWN0bHkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShpZDogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbihpZCwgeyBoaWRlOiAhdmlzaWJsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0YWJsZSBsYXlvdXQgc3RhdGU6IG9uZSBKU09OLXNhZmUgZW50cnkgcGVyIGNvbHVtbiDigJQgaGlkZGVuIG9uZXNcbiAgICogaW5jbHVkZWQg4oCUIGluIGRpc3BsYXkgb3JkZXIuIEZlZWQgaXQgYmFjayB0aHJvdWdoIGBhcHBseUNvbHVtblN0YXRlYC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5TdGF0ZVNuYXBzaG90KCk6IE9uZUNvbHVtblN0YXRlRW50cnlbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlU25hcHNob3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc25hcHNob3QgZnJvbSBgZ2V0Q29sdW1uU3RhdGVTbmFwc2hvdGA6IG9yZGVyLCB3aWR0aCwgcGluIGFuZFxuICAgKiB2aXNpYmlsaXR5LiBJZHMgdGhlIGdyaWQgbm8gbG9uZ2VyIGhhcyBhcmUgc2tpcHBlZCwgc28gYSBzdGFsZSBzbmFwc2hvdFxuICAgKiBkZWdyYWRlcyB0byBhIHBhcnRpYWwgcmVzdG9yZSByYXRoZXIgdGhhbiBhbiBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBhcHBseUNvbHVtblN0YXRlKGVudHJpZXM6IE9uZUNvbHVtblN0YXRlRW50cnlbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLmFwcGx5Q29sdW1uU3RhdGUoZW50cmllcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBBIHJlc3RvcmUgY2FuIHNob3cgY29sdW1ucyB0aGF0IHdlcmUgaGlkZGVuIHdoZW4gdGhlIHJvd3Mgd2VyZSBidWlsdCxcbiAgICAvLyBhbmQgdGhlaXIgY2VsbHMgaGF2ZSBubyBzdGF0ZSB5ZXQuXG4gICAgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hlY2tib3ggc2VsZWN0aW9uIGZlYXR1cmVzXG4gICAqL1xuICBwdWJsaWMgc2V0Tm9kZUFuZENoaWxkcmVuU2VsZWN0ZWQobm9kZTogT25lUm93Tm9kZSwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcblxuICAgIGNvbnN0IHJvd0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY29sbGVjdCA9IChuOiBPbmVSb3dOb2RlKSA9PiB7XG5cbiAgICAgIHJvd0lkcy5hZGQobi5yb3dJZCk7XG5cbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKSB7XG5cbiAgICAgICAgbi5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNvbGxlY3QoY2hpbGQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29sbGVjdChub2RlKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhBcnJheS5mcm9tKHJvd0lkcyksIHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBJZGVudGljYWwgdG8gYHVwZGF0ZUNlbGxTdGF0ZXNgLiBLZXB0IGFzIGFuIGFsaWFzIHNvIGV4aXN0aW5nXG4gICAqIGNhbGxlcnMga2VlcCB3b3JraW5nOyBwcmVmZXIgYHVwZGF0ZUNlbGxTdGF0ZXNgLCB3aGljaCBzYXlzIHdoYXQgaXQgZG9lcy5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVOb2RlU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpIHtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDZWxsU3RhdGUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd05vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgcm93Tm9kZS5jZWxsU3RhdGVzW2NvbHVtbi5maWVsZF0gPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlKHJvd05vZGUsIGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZSBldmVyeSBjZWxsIG9mIG9uZSByb3cgYW5kIHJlcGFpbnQgaXQuXG4gICAqXG4gICAqIFRoZSByZXBhaW50IGlzIHRoZSBwb2ludDogdGhpcyBpcyB3aGF0IGEgY2FsbGVyIHJlYWNoZXMgZm9yIGFmdGVyIG11dGF0aW5nXG4gICAqIGEgcm93IGluIHBsYWNlLCBhbmQgaXQgdXNlZCB0byByZWdlbmVyYXRlIHRoZSBzdGF0ZSBhbmQgc3RvcCB0aGVyZS4gVGhlXG4gICAqIGJvZHkgcmVuZGVycyB3aXRoIE9uUHVzaCwgc28gbm90aGluZyBtYXJrZWQgaXQgZGlydHkgYW5kIHRoZSBuZXcgc3RhdGUgc2F0XG4gICAqIHVucmVhZCB1bnRpbCBzb21lIHVucmVsYXRlZCBldmVudCBoYXBwZW5lZCB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24g4oCUXG4gICAqIHdoaWNoIGlzIHdoeSBjYWxsZXJzIGVuZGVkIHVwIG51ZGdpbmcgdGhlIGdyaWQgd2l0aCBhIHN5bnRoZXRpYyBET00gZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmICghcm93Tm9kZSkgcmV0dXJuO1xuXG4gICAgcm93Tm9kZS5jZWxsU3RhdGVzID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMocm93Tm9kZSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsU3RhdGVDaGFuZ2VkJywgeyBkYXRhOiByb3dOb2RlLmRhdGEsIG5vZGU6IHJvd05vZGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciB0aGF0IFJlYWN0cyB0byBEZXRhaWwgQ2hhbmdlc1xuICAgKi9cbiAgLyoqXG4gICAqIEtlZXAgYSBtYXN0ZXIgcm93J3MgcmVzZXJ2ZWQgaGVpZ2h0IGluIHN0ZXAgd2l0aCBpdHMgZGV0YWlsIHJvd3MuXG4gICAqXG4gICAqIFR3byBsaXN0ZW5lcnMgdXNlZCB0byBiZSByZWdpc3RlcmVkIGhlcmUgYW5kIHRocm93biBhd2F5OiBhbiBlbXB0eVxuICAgKiBgcm93RGF0YUNoYW5nZWRgIGhhbmRsZXIgd2hvc2UgdW5zdWJzY3JpYmUgd2FzIG5ldmVyIGtlcHQsIGFuZCBhblxuICAgKiBgZXhwYW5kZWRDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIGJvZHkgd2FzIGVudGlyZWx5IGNvbW1lbnRlZCBvdXQuIEJvdGggYXJlXG4gICAqIGdvbmUg4oCUIGEgbGlzdGVuZXIgd2l0aCBubyBiZWhhdmlvdXIgaXMgYSBsZWFrIHdpdGggbm8gdXBzaWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmVEZXRhaWwgPSBub2RlLm9uKCdkZXRhaWxSb3dEYXRhQ2hhbmdlZCcsICh7IG5vZGUgfSkgPT4ge1xuXG4gICAgICBpZiAodGhpcy5fYXBpVHlwZSA9PT0gJ21hc3RlcicpIHtcblxuICAgICAgICB0aGlzLnJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTm9kZUNsZWFudXAobm9kZS5yb3dJZCwgW3Vuc3Vic2NyaWJlRGV0YWlsXSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTm9kZUNsZWFudXAocm93SWQ6IHN0cmluZywgdW5zdWJzOiBBcnJheTwoKSA9PiB2b2lkPik6IHZvaWQge1xuXG4gICAgLy8gTWVyZ2Ugd2l0aCBhbnkgZXhpc3RpbmcgY2xlYW51cHMgZm9yIHRoaXMgcm93SWRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCkgPz8gW107XG5cbiAgICB0aGlzLl9ub2RlQ2xlYW51cE1hcC5zZXQocm93SWQsIFsuLi5leGlzdGluZywgLi4udW5zdWJzXSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBOb2RlKHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGNvbnN0IGNsZWFudXBzID0gdGhpcy5fbm9kZUNsZWFudXBNYXAuZ2V0KHJvd0lkKTtcblxuICAgIGNsZWFudXBzPy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuZGVsZXRlKHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZGF0YSwgcmVsZWFzaW5nIHdoYXQgdGhleSBob2xkLlxuICAgKlxuICAgKiBUaGlzIGV4aXN0ZWQgYnV0IHdhcyBuZXZlciBjYWxsZWQ6IGBzZXRSb3dEYXRhYCBhbmQgYHVwZGF0ZVJvd0RhdGFgIGVhY2hcbiAgICogZGVsZXRlZCBzdHJhaWdodCBvdXQgb2YgYF9vcmlnaW5hbFJvd05vZGVzYCwgc28gYSByZW1vdmVkIG5vZGUga2VwdCBpdHNcbiAgICogbGlzdGVuZXJzIGFuZCBpdHMgZW50cnkgaW4gYF9ub2RlQ2xlYW51cE1hcGAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgZ3JpZC5cbiAgICogQm90aCBub3cgY29tZSB0aHJvdWdoIGhlcmUsIHdoaWNoIHVuc3Vic2NyaWJlcyBhbmQgY2xlYXJzIHRoZSBub2RlIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwcnVuZVJlbW92ZWROb2Rlcyh2YWxpZFJvd0lkczogU2V0PHN0cmluZz4pOiB2b2lkIHtcblxuICAgIGZvciAoY29uc3QgW3Jvd0lkLCBub2RlXSBvZiB0aGlzLl9vcmlnaW5hbFJvd05vZGVzKSB7XG5cbiAgICAgIGlmICghdmFsaWRSb3dJZHMuaGFzKHJvd0lkKSkge1xuXG4gICAgICAgIHRoaXMuY2xlYW51cE5vZGUocm93SWQpOyAgLy8gdW5zdWJzY3JpYmUgbGlzdGVuZXJzXG5cbiAgICAgICAgbm9kZS5kZXN0cm95KCk7ICAgICAgICAgICAvLyBjbGVhciBub2RlJ3Mgb3duIGxpc3RlbmVyIG1hcFxuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVpZ2h0IGEgbWFzdGVyIHJvdyBtdXN0IHJlc2VydmUgZm9yIGl0cyBkZXRhaWwgZ3JpZDpcbiAgICogcm93SGVpZ2h0IHggY2xhbXAocm93cywgbWluUm93cywgbWF4Um93cykgKyBoZWFkZXJIZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgaGVpZ2h0T3B0aW9ucyA9IHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zPy5kZXRhaWxHcmlkT3B0aW9ucz8uZGV0YWlsUm93SGVpZ2h0T3B0aW9ucztcblxuICAgIC8vIFJlYWNoYWJsZSB3aGVuZXZlciBtYXN0ZXJEZXRhaWwgaXMgb24gYnV0IGRldGFpbENlbGxSZW5kZXJlclBhcmFtcyBpc1xuICAgIC8vIGluY29tcGxldGU7IHdpdGhvdXQgdGhlIGd1YXJkIHRoaXMgdGhyZXcgZnJvbSBpbnNpZGUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgaWYgKCFoZWlnaHRPcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBtaW5Sb3dzID0gaGVpZ2h0T3B0aW9ucy5taW5Sb3dzO1xuICAgIGNvbnN0IG1heFJvd3MgPSBoZWlnaHRPcHRpb25zLm1heFJvd3M7XG5cbiAgICBjb25zdCBtaW5IZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtaW5Sb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuICAgIGNvbnN0IG1heEhlaWdodCA9ICh0aGlzLnJvd0hlaWdodCAqIG1heFJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG5cbiAgICBjb25zdCByb3dzID0gbm9kZS5kZXRhaWxSb3dEYXRhICYmIG5vZGUuZGV0YWlsUm93RGF0YS5sZW5ndGggPyBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoIDogMDtcblxuICAgIG5vZGUuZGV0YWlsUm93SGVpZ2h0ID0gcm93cyA8PSBtaW5Sb3dzID8gbWluSGVpZ2h0IDogcm93cyA+PSBtYXhSb3dzID8gbWF4SGVpZ2h0IDogKHRoaXMucm93SGVpZ2h0ICogcm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGV2ZXJ5dGhpbmcgdGhlIGdyaWQgaG9sZHMuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudC5uZ09uRGVzdHJveWAuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlcyBhcmUgZGVsaWJlcmF0ZWx5ICpub3QqIG51bGxlZCBvdXQgYW55IG1vcmUuIFRoZXkgYXJlIGluamVjdGVkLFxuICAgKiBBbmd1bGFyIG93bnMgdGhlaXIgbGlmZXRpbWUsIGFuZCBudWxsaW5nIHRoZW0gb25seSBndWFyYW50ZWVkIGFcbiAgICogYFR5cGVFcnJvcmAgZm9yIGFueSBjYWxsYmFjayB0aGF0IGFycml2ZWQgYWZ0ZXIgdGVhcmRvd24g4oCUIGEgZGV0YWlsLXJvd1xuICAgKiBmZXRjaCByZXNvbHZpbmcgbGF0ZSwgb3IgdGhlIGJvZHkncyBkZWZlcnJlZCB1cGRhdGUuIGBfZGVzdHJveWVkYCBtYWtlc1xuICAgKiB0aG9zZSBjYWxscyBuby1vcHMgaW5zdGVhZCwgd2hpY2ggaXMgd2hhdCBhIHRvcm4tZG93biBvYmplY3Qgc2hvdWxkIGRvLlxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZXZlcnkgcGVyLW5vZGUgbGlzdGVuZXIgYmVmb3JlIGRyb3BwaW5nIHRoZSBub2Rlcy5cbiAgICBmb3IgKGNvbnN0IHJvd0lkIG9mIEFycmF5LmZyb20odGhpcy5fbm9kZUNsZWFudXBNYXAua2V5cygpKSkge1xuXG4gICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTtcbiAgICB9XG5cbiAgICAvLyBgZGVzdHJveWAgZHJvcHMgdGhlIHRyZWUgbGlua3MgYW5kIHRoZSBsaXN0ZW5lcnM7IHRoZSBBUEkgbm8gbG9uZ2VyIGhhc1xuICAgIC8vIHRvIHJlYWNoIGluIGFuZCB1bnBpY2sgZWFjaCBub2RlIGl0c2VsZi5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcblxuICAgIGZvciAoY29uc3Qgc2lkZSBvZiBbJ3RvcCcsICdib3R0b20nXSBhcyBPbmVQaW5uZWRSb3dTaWRlW10pIHtcblxuICAgICAgdGhpcy5fcGlubmVkUm93Tm9kZXNbc2lkZV0uZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl92aXNpYmxlUm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmNsZWFyKCk7XG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuY2xlYXIoKTtcbiAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuXG4gICAgLy8gUmVsZWFzZSB0aGUgYmFjay1yZWZlcmVuY2UgdGhlIGNlbGwgc2VydmljZSBob2xkcywgc28gYSB0b3JuLWRvd24gYXBpIGlzXG4gICAgLy8gbm90IGtlcHQgYWxpdmUgYnkgdGhlIHNlcnZpY2UgdGhhdCBvdXRsaXZlcyB0aGlzIGNhbGwuXG4gICAgdGhpcy5jZWxsU2VydmljZS5zZXRHcmlkQXBpKG51bGwpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG4gICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gW107XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fc29ydE1vZGVsID0gW107XG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG5cbiAgICB0aGlzLm1hc3RlckRldGFpbCA9IGZhbHNlO1xuICAgIHRoaXMudHJlZURhdGEgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IG51bGw7XG4gICAgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9IDA7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBudWxsO1xuICAgIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuX2dldERldGFpbFJvd0RhdGEgPSBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGRlc3Ryb3lgIGhhcyBydW4uIExhdGUgY2FsbGJhY2tzIGNoZWNrIHRoaXMgYmVmb3JlIGRvaW5nIHdvcmsuICovXG4gIHB1YmxpYyBnZXQgZGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3llZDtcbiAgfVxufVxuIl19