@firestitch/report 18.21.0 → 18.21.2

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.
@@ -454,19 +454,23 @@ export class ReportFilterStateService {
454
454
  this._stateChanged$.next();
455
455
  }
456
456
  // Notifications relevant to ONE component: any change to a group one of its
457
- // filters belongs to (or a full re-init).
457
+ // filters belongs to (or a full re-init). The component is read on each
458
+ // event, never captured at subscribe: a tile keeps its subscription across
459
+ // report loads, so a filter added to it while the report is open (the MCP,
460
+ // a chat edit, the settings dialog) reaches it on the first change of its
461
+ // group.
458
462
  changesFor(component) {
459
- const groupIds = new Set((component.filters ?? []).map((filter) => filter.filterGroupId));
460
463
  return this._changed$.asObservable()
461
- .pipe(rxFilter((groupId) => groupId === null || groupIds.has(groupId)));
464
+ .pipe(rxFilter((groupId) => groupId === null
465
+ || (component().filters ?? []).some((filter) => filter.filterGroupId === groupId)));
462
466
  }
463
467
  // Notifications relevant to ANY of a set of components that comes and goes
464
468
  // (a page's values): a change to a group one of their filters belongs to.
465
- // Unlike changesFor, the set is read on each event rather than captured at
466
- // subscribe, so one subscription follows the set as the report reloads. A
467
- // full re-init (null) is not passed on: init() runs on a report
468
- // (re)load, and a caller of this checks on that reload itself whether the
469
- // filter values its components are read with moved.
469
+ // Like changesFor, the set is read on each event, so one subscription
470
+ // follows the set as the report reloads. Unlike it, a full re-init (null)
471
+ // is not passed on: init() runs on a report (re)load, and a caller of this
472
+ // checks on that reload itself whether the filter values its components
473
+ // are read with moved.
470
474
  changesForAny(components) {
471
475
  return this._changed$.asObservable()
472
476
  .pipe(rxFilter((groupId) => groupId !== null
@@ -1168,4 +1172,4 @@ export class ReportFilterStateService {
1168
1172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
1169
1173
  type: Injectable
1170
1174
  }] });
1171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUl0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEdBQ2pGLE1BQU0sV0FBVyxDQUFDO0FBb0JuQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFB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QUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUMvQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO3dHQWp1Q1Usd0JBQXdCOzRHQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgR3JpZENsZWFyZWRGaWx0ZXIsIEdyaWRFeHBhbnNpb24sIEdyaWRMYXlvdXQgfSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBmaWx0ZXIgYXMgcnhGaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBzY2FuIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwgZ2V0Wm9uZWROb3csIHJlc29sdmVGb3JtYXRDb250ZXh0LCByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnREcmlsbFN0ZXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1kcmlsbC1zdGVwLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJNYXRjaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1tYXRjaC50eXBlJztcbmltcG9ydCB7IFJlcG9ydEdyaWRTZXNzaW9uTGF5b3V0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZ3JpZC1zZXNzaW9uLWxheW91dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGVtcG9yYXJ5U3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC10ZW1wb3Jhcnktc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFRpbGVTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXRpbGUtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFN0YXRlU25hcHNob3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zdGF0ZS1zbmFwc2hvdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBGaWx0ZXJHcm91cFZhbHVlLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydFJlbGF0aXZlUmFuZ2UsXG4gIFJlcG9ydFNvcnQsXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsaXN0SGlkZGVuQ29sdW1ucywgbGlzdFNvcnRUZXJtcyB9IGZyb20gJy4uL2xpc3QtY29uZmlnJztcbmltcG9ydCB7IGRhdGVCb3VuZFN0cmluZywgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgZ3JvdXBWYWx1ZVNpZ25hdHVyZSB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHtcbiAgR1JJRF9HUkFOVUxBUklUSUVTLCBhdXRob3JlZEdyaWRMYXlvdXQsIGdyYWluZWRHcmlkTGF5b3V0LCBncmlkTGF5b3V0S2V5LCByZWJhc2VkR3JpZExheW91dCxcbn0gZnJvbSAnLi4vcmVwb3J0LWdyaWQtbGF5b3V0JztcbmltcG9ydCB7IGlzVGlsZSB9IGZyb20gJy4uL3JlcG9ydC10aWxlJztcbmltcG9ydCB7XG4gIGNsZWFuRHJpbGxQYXRoLCBmaW5pdGVOdW1iZXIsIGlzUmVsYXRpdmVSYW5nZSwgc2FtZURyaWxsUGF0aCwgc2FtZVN0b3JlZEdyb3VwVmFsdWUsXG4gIHN0YXRlRGlmZmVycywgdG9TdG9yZWRHcm91cFZhbHVlLFxufSBmcm9tICcuLi9yZXBvcnQtc3RhdGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50RGF0YVN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IHRpbGVEYXRhU3RhdGUgfSBmcm9tICcuLi90aWxlLWRhdGEtc3RhdGUnO1xuaW1wb3J0IHsgcmVwb3J0Q29tcG9uZW50cyB9IGZyb20gJy4uL3ZhbHVlcyc7XG5cblxuLy8gV2hldGhlciB0d28gc3RvcmVkIGZpbHRlci1ncm91cCBkZWZhdWx0cyBhcmUgdGhlIHNhbWUuIENvbXBhcmVkIG9uIHRoZSBmaWVsZHMgYVxuLy8gZGVmYXVsdCBjYW4gYWN0dWFsbHkgY2FycnksIHNvIGtleSBvcmRlciBpbiB0aGUgcGF5bG9hZCBjYW4ndCByZWFkIGFzIGEgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVEZWZhdWx0KFxuICBhOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuICBiOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiAhYSAmJiAhYjtcbiAgfVxuXG4gIHJldHVybiBhLnN0YXJ0ID09PSBiLnN0YXJ0XG4gICAgJiYgYS5lbmQgPT09IGIuZW5kXG4gICAgJiYgYS52YWx1ZSA9PT0gYi52YWx1ZVxuICAgICYmIGEucmVsYXRpdmUgPT09IGIucmVsYXRpdmVcbiAgICAmJiBzYW1lTGlzdChhLnZhbHVlcywgYi52YWx1ZXMpXG4gICAgJiYgc2FtZUxpc3QoYS5leGNsdWRlVmFsdWVzLCBiLmV4Y2x1ZGVWYWx1ZXMpXG4gICAgJiYgYS5taW4gPT09IGIubWluXG4gICAgJiYgYS5tYXggPT09IGIubWF4O1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBsaXN0cyBob2xkIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVMaXN0KGE6IHVua25vd25bXSB8IHVuZGVmaW5lZCwgYjogdW5rbm93bltdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoYSA/PyBbXSkubGVuZ3RoID09PSAoYiA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEgPz8gW10pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSAoYiA/PyBbXSlbaW5kZXhdKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0IHNvcnRzIG9yZGVyIHRoZSByb3dzIHRoZSBzYW1lIHdheS4gTm8gZGlyZWN0aW9uIHJlYWRzIGFzXG4vLyBhc2NlbmRpbmcsIHRoZSB3YXkgdGhlIGxpc3QgYXBwbGllcyBpdC5cbmZ1bmN0aW9uIHNhbWVTb3J0KGE6IFJlcG9ydFNvcnQsIGI6IFJlcG9ydFNvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWJcbiAgICAmJiBhLmNvbHVtbiA9PT0gYi5jb2x1bW5cbiAgICAmJiAoYS5kaXJlY3Rpb24gPz8gJ2FzYycpID09PSAoYi5kaXJlY3Rpb24gPz8gJ2FzYycpO1xufVxuXG5cbi8vIFdoZXRoZXIgYSB2YWx1ZSByZWFkIG9mZiBhIGZpbHRlciBiYXIgaXMgdGhlIHZhbHVlIGFscmVhZHkgc3RvcmVkIGZvciBpdHNcbi8vIGdyb3VwOiB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLCB0aGUgc2FtZSBzZWxlY3QgdmFsdWVzIGtlcHQgb3IgbGVmdCBvdXQgaW5cbi8vIHRoZSBzYW1lIG9yZGVyLCB0aGUgc2FtZSB0cmltbWVkIHRleHQgYW5kIHRoZSBzYW1lIG51bWJlciByYW5nZSBlbmRzLiBBXG4vLyBiYXIgcmUtcmVhZHMgZXZlcnkgZ3JvdXAgaXQgc2hvd3Mgb24gYW55IGNoYW5nZSwgc28gdGhpcyBpcyB3aGF0IHRlbGxzIHRoZVxuLy8gZ3JvdXAgdGhhdCBjaGFuZ2VkIGZyb20gdGhlIG9uZXMgdGhhdCBkaWQgbm90LlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVGaWx0ZXJWYWx1ZShcbiAgYTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGI6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBncm91cFZhbHVlU2lnbmF0dXJlKGEpID09PSBncm91cFZhbHVlU2lnbmF0dXJlKGIpO1xufVxuXG5cbi8vIFRoZSBncm91cHMgYSBiYXIgcmUtcmVhZCB0aGF0IGl0IG5vdyBzaG93cyB3aXRoIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGUgb25lXG4vLyBpdCBsYXN0IHJlcG9ydGVkLCByZWNvcmRpbmcgZWFjaCBuZXcgdmFsdWUgaW4gYGxhc3RSZXBvcnRlZGAuIEEgYmFyIGlzXG4vLyBjb21wYXJlZCB3aXRoIGl0c2VsZiwgbmV2ZXIgd2l0aCB0aGUgc3RvcmVkIHZhbHVlOiBhIGdyb3VwIHNob3duIGluIHR3byBiYXJzXG4vLyAobGV2ZWwgJ2JvdGgnKSBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgb3RoZXIgb25lLCBhbmQgdGhpcyBiYXIgaXMgbm90XG4vLyByZXBhaW50ZWQsIHNvIGl0cyBzdGFsZSB2YWx1ZSBtdXN0IG5vdCBiZSBzZXQgYmFjayB3aGVuIHRoZSB2aWV3ZXIgY2hhbmdlc1xuLy8gYW5vdGhlciBvZiBpdHMgaXRlbXMgKHRoZSBsaXN0IHNlYXJjaCBib3gsIHNheSkuXG5leHBvcnQgZnVuY3Rpb24gbW92ZWRHcm91cFZhbHVlcyhcbiAgbGFzdFJlcG9ydGVkOiBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4sXG4gIHJlcG9ydGVkOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIHJlcG9ydGVkLmZpbHRlcigoeyBncm91cElkLCB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKHNhbWVGaWx0ZXJWYWx1ZShsYXN0UmVwb3J0ZWQuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsYXN0UmVwb3J0ZWQuc2V0KGdyb3VwSWQsIHZhbHVlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuXG4vLyBBIGxpc3QncyBzZWFyY2ggdGV4dCBhcyB0aGUgc2VydmVyIGFwcGxpZXMgaXQ6IHRyaW1tZWQsIHRoZW4gY3V0IHRvXG4vLyBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIGNoYXJhY3RlcnMgKGNvZGUgcG9pbnRzLCBhcyB0aGUgc2VydmVyIGNvdW50cyB0aGVtKS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0U2VhcmNoVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gWy4uLnRleHQudHJpbSgpXS5zbGljZSgwLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIKS5qb2luKCcnKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0cyBvZiBjb2x1bW4gbmFtZXMgYXJlIHRoZSBzYW1lIG5hbWVzIGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gc2FtZU5hbWVzKGE6IHJlYWRvbmx5IHN0cmluZ1tdLCBiOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKG5hbWUsIGluZGV4KSA9PiBuYW1lID09PSBiW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gaGlkZGVuLWNvbHVtbiBtYXBzIGhpZGUgdGhlIHNhbWUgY29sdW1ucyBvbiB0aGUgc2FtZSBsaXN0cy5cbmZ1bmN0aW9uIHNhbWVIaWRkZW4oXG4gIGE6IFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+LFxuICBiOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5zaXplID09PSBiLnNpemVcbiAgICAmJiBbLi4uYV0uZXZlcnkoKFtjb21wb25lbnRJZCwgbmFtZXNdKSA9PiBzYW1lTmFtZXMobmFtZXMsIGIuZ2V0KGNvbXBvbmVudElkKSA/PyBbXSkpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGRhdGUtcmFuZ2UgdmFsdWVzIGNvdmVyIHRoZSBzYW1lIGNhbGVuZGFyIGRheXMuXG5mdW5jdGlvbiBzYW1lRGF5cyhhOiBGaWx0ZXJHcm91cFZhbHVlLCBiOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkYXRlQm91bmRTdHJpbmcoYS5zdGFydCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLnN0YXJ0KVxuICAgICYmIGRhdGVCb3VuZFN0cmluZyhhLmVuZCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLmVuZCk7XG59XG5cblxuLy8gQSBzdGFibGUgc2lnbmF0dXJlIGZvciBhIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuIFRoZSByZXBvcnQgdG9vbGJhciBrZXlzIGl0c1xuLy8gZnMtZmlsdGVyIG9uIHRoaXMsIGJlY2F1c2UgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0IOKAlCB3aXRob3V0IGFcbi8vIGtleSBjaGFuZ2UgaXQga2VlcHMgcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCBldmVuIGFmdGVyIHRoZVxuLy8gY29uZmlnIGJlaGluZCBpdCBoYXMgYmVlbiByZWJ1aWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWduYXR1cmUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogc3RyaW5nIHtcbiAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gIGlmICghZ3JvdXBEZWZhdWx0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBncm91cERlZmF1bHQuc3RhcnQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LmVuZCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQudmFsdWUgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnJlbGF0aXZlID8/ICcnLFxuICAgIChncm91cERlZmF1bHQudmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gICAgKGdyb3VwRGVmYXVsdC5leGNsdWRlVmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gICAgZ3JvdXBEZWZhdWx0Lm1pbiA/PyAnJyxcbiAgICBncm91cERlZmF1bHQubWF4ID8/ICcnLFxuICBdLmpvaW4oJ34nKTtcbn1cblxuXG4vLyBUaGUgdGVtcG9yYXJ5IGxheWVyIHdpdGggbm90aGluZyBwaWNrZWQuXG5mdW5jdGlvbiBlbXB0eVRlbXBvcmFyeVN0YXRlKCk6IFJlcG9ydFRlbXBvcmFyeVN0YXRlIHtcbiAgcmV0dXJuIHsgY3Jvc3NGaWx0ZXJzOiBbXSwgc2hvd1Jvd3M6IG51bGwgfTtcbn1cblxuXG4vLyBWaWV3ZXIgZmlsdGVyIHN0YXRlIGZvciB0aGUgb3BlbiByZXBvcnQuIEZpbHRlciBWQUxVRVMgYXJlIG5ldmVyIHNhdmVkIHRvXG4vLyB0aGUgcmVwb3J0IOKAlCB0aGlzIHNlcnZpY2UgaG9sZHMgdGhlbSBwZXIgZmlsdGVyIEdST1VQICh0aGUgcHJvcGFnYXRpb24gdW5pdCksXG4vLyByZXNvbHZlcyB0aGVtIGludG8gcGVyLWNvbXBvbmVudCBtZW1iZXItZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBkYXRhIHJlcXVlc3QsXG4vLyBhbmQgbm90aWZpZXMgdGhlIGNvbXBvbmVudHMgd2hvc2UgZ3JvdXBzIGNoYW5nZWQgc28gb25seSB0aGV5IHJlZmV0Y2guXG4vL1xuLy8gSXQgaXMgdGhlIG9uZSBwbGFjZSB0aGUgdmlld2VyJ3Mgc3RhdGUgbGl2ZXMgd2hpbGUgdGhlIHJlcG9ydCBpcyBvcGVuOiB0aGVcbi8vIGdyb3VwIHZhbHVlcywgdGhlIGdyb3VwLWJ5IGdyYWluLCB0aGUgbWF0Y2gsIGxpc3Qgc29ydHMsIHNlYXJjaGVzIGFuZCBoaWRkZW5cbi8vIGNvbHVtbnMsIHRoZSBwYWdlLCBlYWNoIGNoYXJ0J3MgZHJpbGwgcGF0aCBhbmQgZWFjaCB0YWJsZSdzIGxheW91dC4gTm9uZSBvZlxuLy8gaXQgaXMgZXZlciB3cml0dGVuIHRvIHRoZSBicm93c2VyIFVSTC4gSXQgb3V0bGl2ZXMgYSBwYWdlIHN3aXRjaCAodGhlIGNhbnZhc1xuLy8gY2hhbmdlcyB0aGUgcGFnZSwgbm90IHRoaXMgc2VydmljZSkgYW5kIGdvZXMgd2l0aCB0aGUgcmVwb3J0IHZpZXc6IGEgcmVsb2FkXG4vLyBzdGFydHMgYSBuZXcgc2VydmljZSwgd2hpY2ggb3BlbnMgb24gdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzLlxuLy8gY2hhbmdlcygpIGZpcmVzIG9uIGV2ZXJ5IGNoYW5nZSBvZiBpdC5cbi8vXG4vLyBUaGUgZHVyYWJsZSBwYXJ0IHJlYWRzIGFzIG9uZSBkb2N1bWVudDogc25hcHNob3QoKSB3cml0ZXMgaXQsIGFuZFxuLy8gZGlmZmVyc0Zyb21EZWZhdWx0cyBzYXlzIHdoZXRoZXIgdGhlIHNjcmVlbiBzdGlsbCBzaG93cyB0aGUgcmVwb3J0J3Ncbi8vIGF1dGhvcmVkIGRlZmF1bHRzIChyZXNldFRvRGVmYXVsdHMoKSBwdXRzIGl0IGJhY2sgb24gdGhlbSkuIFRoZSB0ZW1wb3Jhcnlcbi8vIGxheWVyIChhIGNyb3NzLWZpbHRlciwgYW4gb3BlbiByb3dzIHBhbmVsKSBpcyBpdHMgb3duIHNlY3Rpb24sIHNvIGFcbi8vIHNuYXBzaG90IG5ldmVyIGNhcnJpZXMgaXQuXG4vL1xuLy8gU2Vzc2lvbi1vbmx5LCBuZXZlciBpbiB0aGUgc25hcHNob3Q6IHBlci1maWx0ZXIgZW5hYmxlL2Rpc2FibGUgdG9nZ2xlcyBmcm9tXG4vLyBhIGNvbXBvbmVudCdzIGZpbHRlciBtZW51ICh0aGUgYGVuYWJsZWRgIGNvbHVtbiBpcyB0aGUgYXV0aG9yZWQgZGVmYXVsdDsgYVxuLy8gdmlld2VyJ3MgdG9nZ2xlIHNob3VsZG4ndCB3cml0ZSB0byB0aGUgcmVwb3J0KSwgYW5kIGVhY2ggdGFibGUncyBsYXlvdXQsXG4vLyB3aGljaCBmcy1ncmlkIHNlbmRzIHdpdGggdGhlIHRhYmxlJ3Mgb3duIHJlYWRzLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUgKHJlc29sdmVSZXBvcnRUaW1lem9uZSkuIFJlbGF0aXZlIHByZXNldHNcbiAgLy8gcmVzb2x2ZSBhZ2FpbnN0IHRvZGF5IGluIGl0LCBhbmQgZGF0ZSBjZWxscyByZW5kZXIgaW4gaXQuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IHNpZ25hbDxzdHJpbmc+KCdVVEMnKTtcblxuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKHJlc29sdmVGb3JtYXRDb250ZXh0KTpcbiAgLy8gaXRzIGxvY2FsZSwgaXRzIGN1cnJlbmN5IGFuZCB3aGV0aGVyIHBlcmNlbnRzIGFycml2ZSBhcyByYXRpb3MuIEV2ZXJ5IEtQSSxcbiAgLy8gY2hhcnQsIGRhdGUgY2VsbCBhbmQgZXhwb3J0IHJlYWRzIGl0IGhlcmUuIENvbXBhcmVkIGJ5IHZhbHVlLCBzbyBhIHJlbG9hZFxuICAvLyBvZiBhbiB1bmNoYW5nZWQgcmVwb3J0IHJlLXJlbmRlcnMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdENvbnRleHQgPSBzaWduYWw8UmVwb3J0Rm9ybWF0Q29udGV4dD4oREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwge1xuICAgIGVxdWFsOiAoYSwgYikgPT4gYS5sb2NhbGUgPT09IGIubG9jYWxlXG4gICAgICAmJiBhLmN1cnJlbmN5ID09PSBiLmN1cnJlbmN5XG4gICAgICAmJiBhLnJhdGlvUGVyY2VudCA9PT0gYi5yYXRpb1BlcmNlbnQsXG4gIH0pO1xuXG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gZWFjaCBwbGFpbiBsaXN0IChsaXN0SGlkZGVuQ29sdW1ucyksXG4gIC8vIGJ5IGNvbXBvbmVudCBpZDsgYSBsaXN0IHNob3dpbmcgZXZlcnkgY29sdW1uIGhhcyBubyBlbnRyeS4gQSBzaWduYWwsIHNvIGFcbiAgLy8gbGlzdCBoaWRlcyBhbmQgc2hvd3MgaXRzIGNvbHVtbnMgaW4gcGxhY2U6IHRoZSByb3dzIGRvIG5vdCBjaGFuZ2UsIHNvXG4gIC8vIG5vdGhpbmcgcmVmZXRjaGVzLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWQgdGhhdCBrZWVwcyBldmVyeSBjb2x1bW5cbiAgLy8gcmVwYWludHMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RIaWRkZW4gPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4+KG5ldyBNYXAoKSwge1xuICAgIGVxdWFsOiBzYW1lSGlkZGVuLFxuICB9KTtcblxuICAvLyBNb3ZlcyBlYWNoIHRpbWUgcmVzZXRUb0RlZmF1bHRzKCkgcmVwbGFjZXMgdGhlIHdob2xlIGR1cmFibGUgc3RhdGUuIEJhcnNcbiAgLy8gYW5kIHRpbGVzIGtleSBvbiBpdCwgc28gYSByZXNldCByZXBhaW50cyBhbGwgb2YgdGhlbTsgdGhlIHRpbGVzIHJlZmV0Y2hcbiAgLy8gaW4gcGxhY2UsIHNvIHRoZWlyIGRhdGEgc3RheXMgb24gc2NyZWVuIHdoaWxlIHRoZXkgcmVsb2FkLlxuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVWZXJzaW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc3RhdGVWZXJzaW9uKCkpO1xuXG4gIC8vIEJ5IGxpc3QgY29tcG9uZW50IGlkLCBob3cgbWFueSByZXNldHMgbW92ZWQgdGhhdCBsaXN0J3Mgc29ydC4gRnNMaXN0XG4gIC8vIHJlYWRzIGl0cyBzb3J0IG9ubHkgd2hlbiBpdCBpcyBjcmVhdGVkLCBzbyBhIGxpc3Qgd2hvc2Ugc29ydCBhIHJlc2V0XG4gIC8vIG1vdmVkIGlzIGRyYXduIGFnYWluIChrZXllZCBvbiBpdHMgY291bnQpOyBldmVyeSBvdGhlciB0aWxlIHJlbG9hZHMgaW5cbiAgLy8gcGxhY2UuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0U29ydFJlc2V0cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2xpc3RTb3J0UmVzZXRzKCkpO1xuXG4gIC8vIFRoZSBvcGVuIHBhZ2UsIG9yIG51bGwgYmVmb3JlIHRoZSBob3N0IHJlcG9ydHMgb25lIChzZXRQYWdlKS5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2UgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9wYWdlSWQoKSk7XG5cbiAgLy8gSG93IHRoZSBncm91cHMgY29tYmluZTogJ2FsbCcga2VlcHMgdGhlIHJvd3MgZXZlcnkgZ3JvdXAga2VlcHMsICdhbnknXG4gIC8vIHRoZSByb3dzIGF0IGxlYXN0IG9uZSBlbGlnaWJsZSBncm91cCBrZWVwcyAoc2V0TWF0Y2gpLlxuICBwdWJsaWMgcmVhZG9ubHkgbWF0Y2ggPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9tYXRjaCgpKTtcblxuICAvLyBUaGUgdmlld2VyIGZlYXR1cmVzIHRoZSBvcGVuIHJlcG9ydCdzIHNlcnZlciBzZXJ2ZXMgKFJlcG9ydC52aWV3ZXJGZWF0dXJlcyk6XG4gIC8vIGEgZmlsdGVyIGJhciBvZmZlcnMgYSBjb250cm9sIG9ubHkgd2hlbiBpdHMgZmVhdHVyZSBpcyBsaXN0ZWQuIEVtcHR5XG4gIC8vIGJlZm9yZSBhIHJlcG9ydCBpcyBvcGVuIGFuZCBmcm9tIGFuIG9sZGVyIHNlcnZlci5cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdlckZlYXR1cmVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcmVwb3J0KCk/LnZpZXdlckZlYXR1cmVzID8/IFtdKTtcblxuICAvLyBUaGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQsIG9yIG51bGwgYmVmb3JlIG9uZSBpcyBvcGVuLiBBIHRpbGUgaGVhZGVyXG4gIC8vIGxpc3RzIGl0cyBzZWxlY3Qgb3B0aW9ucyBmcm9tIGl0IChSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSkuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9yZXBvcnQoKSk7XG5cbiAgLy8gV2hldGhlciB0aGUgc2NyZWVuIGRpZmZlcnMgZnJvbSB0aGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHNcbiAgLy8gKHN0YXRlRGlmZmVycyk6IHdoYXQgdGhlIHJlcG9ydCBiYXIncyAnQ2xlYXIgZmlsdGVycycgc2hvd3MgZm9yLiBBIHN3aXRjaFxuICAvLyBvZiBwYWdlIGRvZXMgbm90IGNvdW50LCBhbmQgdGhlIHRlbXBvcmFyeSBzdGF0ZSBuZXZlciBkb2VzLlxuICAvLyBBIHRhYmxlIHRpbGUgaW4gYSBsYXlvdXQgb2YgdGhlIHZpZXdlcidzIG93biBjb3VudHMgdG9vOyBpdCBzdGF5cyBvdXQgb2ZcbiAgLy8gdGhlIHNuYXBzaG90LCBzbyBubyBzYXZlZCBmaWx0ZXIgb3IgbGluayBjYXJyaWVzIGl0LlxuICBwdWJsaWMgcmVhZG9ubHkgZGlmZmVyc0Zyb21EZWZhdWx0cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICB0aGlzLl9yZXZpc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRMYXlvdXRzKCkuc2l6ZSA+IDAgfHwgc3RhdGVEaWZmZXJzKHRoaXMuYXV0aG9yZWRDb25maWcoKSwgdGhpcy5zbmFwc2hvdCgpKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWU+KCk7XG4gIHByaXZhdGUgX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbkRpc2FibGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gR3JvdXBzIHRoYXQgaGF2ZSBhIGRlZmF1bHQgdGhlIHZpZXdlciBjbGVhcmVkLiBXaXRob3V0IHRoaXMgYSByZWxvYWQgb2YgdGhlXG4gIC8vIHJlcG9ydCAoYSBjaGF0IGVkaXQsIGEgZGlhbG9nKSB3b3VsZCBmaW5kIG5vIHZhbHVlIGZvciB0aGUgZ3JvdXAgYW5kIHNlZWRcbiAgLy8gaXRzIGRlZmF1bHQgc3RyYWlnaHQgYmFjay4gQSBjaGFuZ2UgdG8gdGhlIHN0b3JlZCBkZWZhdWx0IHJlbGVhc2VzIGl0LlxuICBwcml2YXRlIF9jbGVhcmVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2w6IGEgc2luZ2xlIHJlcG9ydC13aWRlIGJ1Y2tldCBvdmVycmlkZSBmb3IgYWxsXG4gIC8vIHRoZSB0aWxlcyB0aGF0IGZvbGxvdyBpdCAoZm9sbG93c0dyb3VwQnkpLiBVbnNldCA9IGVhY2ggb25lIHVzZXMgaXRzXG4gIC8vIGF1dGhvcmVkIGdyYW51bGFyaXR5LiBOZXZlclxuICAvLyBzYXZlZCB0byB0aGUgcmVwb3J0LCBhbmQgY2FycmllZCBpbiB0aGUgZGF0YSByZXF1ZXN0J3NcbiAgLy8gYHN0YXRlYCwgc28gaXQgcHJvcGFnYXRlcyB0aHJvdWdoIHRvIHRoZSBQREYvUG93ZXJQb2ludCBleHBvcnRzIHRvby4gTmFtZWRcbiAgLy8gZm9yIHRoZSBgZnJlcXVlbmN5YCB3aXJlIGtleSBpdCB0cmF2ZWxzIHVuZGVyLCBub3QgZm9yIHRoZSBjb250cm9sJ3MgbGFiZWwuXG4gIHByaXZhdGUgX2ZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9mcmVxdWVuY3lDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgdmlld2VyLWNob3NlbiBzb3J0LCBieSBjb21wb25lbnQgaWQuIEhlbGQgaGVyZSByYXRoZXIgdGhhbiBvbmx5XG4gIC8vIGluIHRoZSBsaXN0J3MgRnNMaXN0IHNvIGl0IHN1cnZpdmVzIHRoZSBsaXN0IGJlaW5nIHJlY3JlYXRlZCAoYSBwYWdlIHN3aXRjaCxcbiAgLy8gYSByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkgYW5kIHNvIGV2ZXJ5IGNvbnN1bWVyIG9mIHZpZXdlciBzdGF0ZSByZWFkcyBvbmUgcGxhY2UuXG4gIHByaXZhdGUgX2xpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpLCBieSBjb21wb25lbnQgaWQuIEEgbGlzdCB3aXRoXG4gIC8vIGFuIGVtcHR5IGJveCBoYXMgbm8gZW50cnkuIEhlbGQgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29ucyBhcyB0aGUgc29ydHMsIGFuZFxuICAvLyBiZWNhdXNlIHRoZSBib3ggbGl2ZXMgaW4gdGhlIGNvbXBvbmVudCBoZWFkZXIsIG5vdCBpbiB0aGUgbGlzdC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaGVzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBsaXN0cywgYnkgY29tcG9uZW50IGlkLCBzbyBhIGZpbHRlciB0b2dnbGUgY2FuIHRlbGxcbiAgLy8gd2hpY2ggb2YgdGhlbSBsb3NlIHRoZWlyIHNlYXJjaCBib3ggKGxpc3RTZWFyY2hhYmxlKS5cbiAgcHJpdmF0ZSBfbGlzdHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0Q29tcG9uZW50PigpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2guIExpc3Qgc2VhcmNoIGFuZCBlZmZlY3RpdmVMb2NhbGVcbiAgLy8gc2hpcCBpbiB0aGUgc2FtZSBmcmFtZXdvcmsgY2hhbmdlIHNldCwgc28gYSBzZXJ2ZXIgdGhhdCBzZW5kcyBub1xuICAvLyBlZmZlY3RpdmVMb2NhbGUgaGFzIG5laXRoZXIsIGFuZCBpdHMgbGlzdHMgc2hvdyBubyBzZWFyY2ggYm94LlxuICBwcml2YXRlIF9zZXJ2ZXJTZWFyY2hlcyA9IGZhbHNlO1xuXG4gIC8vIEVtaXRzIHRoZSBpZCBvZiB0aGUgbGlzdCB3aG9zZSBzZWFyY2ggdGV4dCBjaGFuZ2VkLlxuICBwcml2YXRlIF9saXN0U2VhcmNoQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgLy8gRW1pdHMgdGhlIGdyb3VwIGlkIHRoYXQgY2hhbmdlZDsgY29tcG9uZW50cyBsaXN0ZW4gZmlsdGVyZWQgdG8gdGhlaXIgb3duXG4gIC8vIGdyb3VwIGlkcy4gbnVsbCA9IGV2ZXJ5dGhpbmcgY2hhbmdlZCAocmUtaW5pdCkuXG4gIHByaXZhdGUgX2NoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvLyBGaXJlcyB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUgdmlld2VyIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQuXG4gIHByaXZhdGUgX3N0YXRlQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIENvdW50cyB0aGUgY2hhbmdlcyBjaGFuZ2VzKCkgcmVwb3J0cy4gVGhlIGdyb3VwIHZhbHVlcywgdGhlIGdyYWluIGFuZFxuICAvLyB0aGUgbGlzdCBzdGF0ZSB0aGF0IGRpZmZlcnNGcm9tRGVmYXVsdHMgY29tcGFyZXMgYXJlIHRoZSBwbGFpbiBmaWVsZHNcbiAgLy8gYWJvdmUsIHdoaWNoIGV2ZXJ5IHNldHRlciByZXBvcnRzIHRocm91Z2ggY2hhbmdlcygpICh0aGV5IGFyZSBzaGFyZWRcbiAgLy8gd2l0aCB0aGUgaW5saW5lIHZhbHVlcyBidWlsZCwgc28gdGhleSBzdGF5IGFzIHRoZXkgYXJlKTsgdGhpcyBjb3VudGVyIGlzXG4gIC8vIGhvdyB0aGUgY29tcHV0ZWQgaGVhcnMgb2YgdGhlbS4gVGhlIHBhZ2UsIG1hdGNoIGFuZCBkcmlsbHMgYmVsb3cgYXJlXG4gIC8vIHNpZ25hbHMgYW5kXG4gIC8vIGlzIHJlYWQgZGlyZWN0bHkuIFRoZSBzdWJqZWN0IGlzIHRoaXMgc2VydmljZSdzIG93biBhbmQgaXMgbmV2ZXJcbiAgLy8gY29tcGxldGVkLCBzbyB0aGUgc2lnbmFsIGxpc3RlbnMgdG8gaXQgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBzZXJ2aWNlXG4gIC8vIGxpdmVzLlxuICBwcml2YXRlIF9yZXZpc2lvbiA9IHRvU2lnbmFsKHRoaXMuX3N0YXRlQ2hhbmdlZCQucGlwZShzY2FuKChjb3VudCkgPT4gY291bnQgKyAxLCAwKSksIHtcbiAgICBpbml0aWFsVmFsdWU6IDAsXG4gICAgbWFudWFsQ2xlYW51cDogdHJ1ZSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfc3RhdGVWZXJzaW9uID0gc2lnbmFsKDApO1xuXG4gIHByaXZhdGUgX2xpc3RTb3J0UmVzZXRzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgbnVtYmVyPj4obmV3IE1hcCgpKTtcblxuICAvLyBUaGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQ6IHRoZSB0aWxlcyBhbmQgcGFnZXMgdGhlIHN0YXRlIGlzIGNoZWNrZWRcbiAgLy8gYWdhaW5zdC5cbiAgcHJpdmF0ZSBfcmVwb3J0ID0gc2lnbmFsPFJlcG9ydCB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBvcGVuIHBhZ2UsIHNldCBieSB0aGUgaG9zdCBhcyB0aGUgdmlld2VyIG1vdmVzIGJldHdlZW4gcGFnZXMuXG4gIHByaXZhdGUgX3BhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lOiAnYWxsJyAodGhlIGRlZmF1bHQpIG9yICdhbnknLlxuICBwcml2YXRlIF9tYXRjaCA9IHNpZ25hbDxSZXBvcnRGaWx0ZXJNYXRjaD4oJ2FsbCcpO1xuXG4gIC8vIEVhY2ggY2hhcnQncyBkcmlsbCBwYXRoLCB0b3AgZmlyc3QsIGJ5IGNvbXBvbmVudCBpZC4gQSBjaGFydCBhdCBpdHMgdG9wXG4gIC8vIGhhcyBubyBlbnRyeSwgYW5kIG9ubHkgYSBjaGFydCBoYXMgb25lLlxuICBwcml2YXRlIF9kcmlsbHMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXT4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gRW1pdHMgdGhlIGlkIG9mIHRoZSBjaGFydCB3aG9zZSBkcmlsbCBwYXRoIGNoYW5nZWQuXG4gIHByaXZhdGUgX2RyaWxsQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIGxheW91dCBhIHZpZXdlciBwdXQgZWFjaCB0YWJsZSB0aWxlIGluLCBieSBjb21wb25lbnQgaWQsIHdoaWxlIGl0XG4gIC8vIGRpZmZlcnMgZnJvbSB0aGUgdGlsZSdzIGF1dGhvcmVkIGxheW91dCwgd2l0aCB0aGUgYXV0aG9yZWQgbGF5b3V0IGl0IHdhc1xuICAvLyBjaGFuZ2VkIGZyb20gKFJlcG9ydEdyaWRTZXNzaW9uTGF5b3V0LmJhc2UpLiBBIHRhYmxlIHNob3dpbmcgaXRzIGF1dGhvcmVkXG4gIC8vIGxheW91dCBoYXMgbm8gZW50cnksIGFuZCBvbmx5IGEgdGFibGUgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfZ3JpZExheW91dHMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCBSZXBvcnRHcmlkU2Vzc2lvbkxheW91dD4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gVGhlIGdyb3VwcyBhIHZpZXdlciBsZWZ0IG9wZW4gaW4gZWFjaCB0YWJsZSB0aWxlLCBieSBjb21wb25lbnQgaWQsIHNvIGFcbiAgLy8gdGlsZSBkcmF3biBhZ2FpbiAoYSBwYWdlIHN3aXRjaCkgb3BlbnMgdGhlbS4gU2Vzc2lvbiBvbmx5OiBubyBDbGVhclxuICAvLyByZXNldHMgdGhlbSwgZGlmZmVyc0Zyb21EZWZhdWx0cyBuZXZlciByZWFkcyB0aGVtLCBhbmQgZnMtZ3JpZCBkcm9wc1xuICAvLyB0aGVtIGl0c2VsZiBvbmNlIHRoZSByb3cgbGV2ZWxzIGNoYW5nZS5cbiAgcHJpdmF0ZSBfZ3JpZEV4cGFuc2lvbnMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCBHcmlkRXhwYW5zaW9uPj4obmV3IE1hcCgpKTtcblxuICAvLyBCeSB0YWJsZSB0aWxlLCB0aGUgY29sdW1uIGZpbHRlciBhIGdyb3VwLWJ5IGNoYW5nZSB0b29rIG91dCBvZiBpdCBhbmRcbiAgLy8gdGhlIGdyYWluIHRoZSB0YWJsZSBub3cgZ3JvdXBzIGJ5IChfZ3JhaW5HcmlkTGF5b3V0cygpKSwgZm9yIGZzLWdyaWQnc1xuICAvLyBzdGF0dXMgbGluZS4gZnMtZ3JpZCBoaWRlcyBpdCBvbmNlIHRoZSBmaWVsZCBpcyBmaWx0ZXJlZCBhZ2FpbjsgYSBDbGVhclxuICAvLyBkcm9wcyBpdC5cbiAgcHJpdmF0ZSBfZ3JpZENsZWFyZWRGaWx0ZXJzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgR3JpZENsZWFyZWRGaWx0ZXI+PihuZXcgTWFwKCkpO1xuXG4gIC8vIFRoZSB0ZW1wb3JhcnkgbGF5ZXI6IGtlcHQgYXBhcnQgZnJvbSBldmVyeXRoaW5nIGFib3ZlLCBzbyBzbmFwc2hvdCgpXG4gIC8vIGFuZCBkaWZmZXJzRnJvbURlZmF1bHRzIG5ldmVyIHJlYWQgaXQuXG4gIHByaXZhdGUgX3RlbXBvcmFyeSA9IHNpZ25hbDxSZXBvcnRUZW1wb3JhcnlTdGF0ZT4oZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcblxuICAvLyBTZWVkIGdyb3VwcyArIHRoZWlyIGRlZmF1bHRzIHdoZW4gYSByZXBvcnQgbG9hZHMuIEV4aXN0aW5nIHNlc3Npb24gdmFsdWVzXG4gIC8vIGZvciBzdGlsbC1leGlzdGluZyBncm91cHMgc3Vydml2ZSBhIHN0cnVjdHVyZSByZS1mZXRjaCAoYSBjaGF0IGVkaXRcbiAgLy8gc2hvdWxkbid0IHJlc2V0IHRoZSB2aWV3ZXIncyBmaWx0ZXJzKSwgYW5kIHNvIGRvZXMgYSBncm91cCB0aGUgdmlld2VyXG4gIC8vIGNsZWFyZWQg4oCUIFVOTEVTUyB0aGUgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdCBpdHNlbGYgY2hhbmdlZCwgd2hpY2ggb25seVxuICAvLyBoYXBwZW5zIHdoZW4gYW4gb3BlcmF0b3Igc2F2ZWQgYSBuZXcgZGVmYXVsdCBpbiByZXBvcnQgc2V0dGluZ3Mgb3IgdGhlXG4gIC8vIGFnZW50IHNldCBvbmUuIFRoYXQgaXMgYW4gZXhwbGljaXQgaW5zdHJ1Y3Rpb24gdG8gcmUtc2VlZCwgc28gaXQgd2lucyBvdmVyXG4gIC8vIHRoZSBzdXJ2aXZpbmcgc2Vzc2lvbiB2YWx1ZTsgd2l0aG91dCBpdCB0aGUgYmFyIGtlZXBzIHNob3dpbmcgd2hhdGV2ZXIgaXRcbiAgLy8gd2FzIGZpcnN0IHNlZWRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgLy9cbiAgLy8gQSBjaGFuZ2Ugb2YgdGhlIHJlcG9ydCdzIHpvbmUgbW92ZXMgXCJ0b2RheVwiLCBzbyBhIHZhbHVlIHN0aWxsIGNhcnJ5aW5nIGl0c1xuICAvLyBncm91cCBkZWZhdWx0J3MgcHJlc2V0IG5hbWUgaXMgcmVzb2x2ZWQgYWdhaW4gaW4gdGhlIG5ldyB6b25lLiBBIHZhbHVlIHRoZVxuICAvLyB2aWV3ZXIgcGlja2VkLCBvciBvbmUgY2FycnlpbmcgYW5vdGhlciBwcmVzZXQgbmFtZSwgaXMga2VwdCBhcyBpdCBpcy5cbiAgcHVibGljIGluaXQocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1RpbWV6b25lID0gdGhpcy50aW1lem9uZSgpO1xuXG4gICAgLy8gU2V0IGZpcnN0OiB0aGUgZGVmYXVsdHMgc2VlZGVkIGJlbG93IHJlc29sdmUgdGhlaXIgcmVsYXRpdmUgcHJlc2V0cyBpbiBpdC5cbiAgICB0aGlzLnRpbWV6b25lLnNldChyZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSk7XG4gICAgdGhpcy5mb3JtYXRDb250ZXh0LnNldChyZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQpKTtcbiAgICAvLyBCZWZvcmUgdGhlIHBydW5pbmc6IGxpc3RTZWFyY2hhYmxlIHJlYWRzIGl0LlxuICAgIHRoaXMuX3NlcnZlclNlYXJjaGVzID0gcmVwb3J0LmVmZmVjdGl2ZUxvY2FsZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdGltZXpvbmVDaGFuZ2VkID0gcHJldmlvdXNUaW1lem9uZSAhPT0gdGhpcy50aW1lem9uZSgpO1xuICAgIGNvbnN0IHByZXZpb3VzR3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuICAgIHRoaXMuX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cC5pZCwgZ3JvdXApO1xuICAgICAgdGhpcy5fc2VlZChncm91cCwgcHJldmlvdXNHcm91cHMuZ2V0KGdyb3VwLmlkKSA/PyBudWxsLCB0aW1lem9uZUNoYW5nZWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RzID0gbmV3IE1hcCh0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpLm1hcCgoY29tcG9uZW50KSA9PiBbY29tcG9uZW50LmlkLCBjb21wb25lbnRdKSk7XG5cbiAgICB0aGlzLl9wcnVuZShyZXBvcnQpO1xuICAgIHRoaXMuX3BydW5lUGFnZVN0YXRlKHJlcG9ydCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHZhbHVlKGdyb3VwSWQ6IG51bWJlcik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpO1xuICB9XG5cbiAgLy8gQSBiYXIncyB2YWx1ZSBmb3IgYSBncm91cC4gQSBkYXRlIHJhbmdlIGtlZXBzIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgb25seVxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgc3RpbGwgdGhlIHN0b3JlZCBkYXlzOiB0aGUgYmFycyByZS1zZXQgZXZlcnkgZ3JvdXAgdGhleVxuICAvLyBzaG93IHdoZW5ldmVyIGFueSBvbmUgb2YgdGhlbSBjaGFuZ2VzLCBhbmQgYW4gdW50b3VjaGVkIHJvbGxpbmcgcmFuZ2UgbXVzdFxuICAvLyBrZWVwIGl0cyBuYW1lIHJhdGhlciB0aGFuIHR1cm4gaW50byB0d28gZml4ZWQgZGF0ZXMuIEFueSBvdGhlciByYW5nZSwgYVxuICAvLyBkYXRlIHBpY2tlciBwcmVzZXQgaW5jbHVkZWQsIGlzIHN0b3JlZCBhcyB0aGUgZml4ZWQgZGF0ZXMgaXQgc2hvd3MuXG4gIHB1YmxpYyBzZXRWYWx1ZShncm91cElkOiBudW1iZXIsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcblxuICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk/LmNvbmZpZz8uZGVmYXVsdCkge1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmFkZChncm91cElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB0aGlzLl93aXRoUHJlc2V0KHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCksIHZhbHVlKSk7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy5cbiAgcHVibGljIHJlc29sdmVSZWxhdGl2ZShuYW1lOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZWxhdGl2ZVJhbmdlKG5hbWUpO1xuICB9XG5cbiAgLy8gVGhlIGFjdGl2ZSBncm91cC1ieSBncmFpbiwgb3IgbnVsbCB3aGVuIHRoZSB2aWV3ZXIgaGFzbid0IGNob3NlbiBvbmUuXG4gIHB1YmxpYyBmcmVxdWVuY3koKTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3k7XG4gIH1cblxuICAvLyBFYWNoIHRhYmxlIHRoYXQgZm9sbG93cyB0aGUgZ3JvdXAtYnkgaGFzIGl0cyBmaWx0ZXIgb24gdGhlIGdyb3VwLWJ5J3NcbiAgLy8gZmllbGQgbW92ZWQgdG8gdGhlIG5ldyBncmFpbiBmaXJzdCAoX2dyYWluR3JpZExheW91dHMoKSksIHNvIGEgdGFibGUgb25cbiAgLy8gc2NyZWVuIHJlYWRzIG9uY2UsIHdpdGggYm90aC5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2dyYWluR3JpZExheW91dHMoKTtcbiAgICB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5uZXh0KCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGlsZSB0aGF0IGZvbGxvd3MgaXRcbiAgLy8gbGlzdGVucyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55XG4gIC8vIGZpbHRlciBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydCB3aGVuIGl0IGlzIHRoZSB2aWV3ZXIncyBvd246IGEgc29ydCB0aGF0IGlzIHRoZVxuICAvLyBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyB0aGUgbGlzdCdzIGRlZmF1bHQsIG5vdCBhIGNob2ljZSwgc28gaXRcbiAgLy8gY2xlYXJzIHRoZSBlbnRyeSBpbnN0ZWFkICh0aGUgcnVsZSBzbmFwc2hvdCgpIGFwcGxpZXMpLiBPdGhlcndpc2UgYVxuICAvLyBsaXN0J3MgZmlyc3QgZmV0Y2ggd291bGQgcmVjb3JkIGl0cyBzZWVkZWQgYXV0aG9yZWQgdGVybSwgYW5kIGEgbGlzdCB0aGVcbiAgLy8gYWdlbnQgcmUtc29ydHMgbGF0ZXIgaW4gdGhlIHNlc3Npb24gd291bGQga2VlcCBzZW5kaW5nIHRoZSBvbGQgdGVybVxuICAvLyBmaXJzdC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb20gdGhlIGZldGNoXG4gIC8vIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZSBpdFxuICAvLyByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgY2hhbmdlcygpIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TGlzdFNvcnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNvcnQ6IFJlcG9ydFNvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5zZXQoY29tcG9uZW50LmlkLCBzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIHRleHQgYSBsaXN0IGlzIHNlYXJjaGVkIGJ5LCBvciBudWxsIHdoZW4gaXRzIHNlYXJjaCBib3ggaXMgZW1wdHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgYSBsaXN0IHNob3dzIHRoZSBzZWFyY2ggYm94IG92ZXIgaXRzIHRleHQgY29sdW1uczogaXQgZG9lcyB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoIChzZWUgX3NlcnZlclNlYXJjaGVzKSwgdW5sZXNzIG9uZSBvZiBpdHMgbGl2ZVxuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gYSBrZXl3b3JkIGdyb3VwIGl0cyBoZWFkZXIgc2hvd3MuIEEgYmFyIHNob3dzIG9uZSBzZWFyY2hcbiAgLy8gYm94IChpdHMgbGFzdCBrZXl3b3JkIGl0ZW0pLCBhbmQgdGhhdCBvbmUgaXMgdGhlIGF1dGhvcidzLiBUaGUgaGVhZGVyLCB0aGVcbiAgLy8gcHJ1bmluZywgdGhlIGRhdGEgcmVxdWVzdCBzdGF0ZSBhbmQgdGhlIGV4cG9ydHMgYWxsIHJlYWRcbiAgLy8gdGhpcyBvbmUgcnVsZSwgc28gbm8gc2VhcmNoIG5hcnJvd3MgYSBsaXN0IHdob3NlIHNjcmVlbiBoYXMgbm8gYm94IHNob3dpbmdcbiAgLy8gaXQsIGFuZCBubyBleHBvcnQgdGl0bGVzIGEgc2VhcmNoIHRoZSBzZXJ2ZXIgZGlkIG5vdCBhcHBseS5cbiAgcHVibGljIGxpc3RTZWFyY2hhYmxlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlclNlYXJjaGVzXG4gICAgICAmJiBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICAmJiAhKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5zb21lKChmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyLmVuYWJsZWRcbiAgICAgICAgICAmJiAhdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpXG4gICAgICAgICAgJiYgZ3JvdXA/LnR5cGUgPT09ICdrZXl3b3JkJ1xuICAgICAgICAgICYmIChncm91cC5sZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCk7IGFuIGVtcHR5IGJveCBjbGVhcnNcbiAgLy8gaXQuIFRoZSBoZWFkZXIgY2FsbHMgdGhpcyBvbiBldmVyeSBjaGFuZ2Ugb2YgYW55IG9mIGl0cyBpdGVtcywgc28gdGhlXG4gIC8vIGxpc3QgYW5kIGNoYW5nZXMoKSBoZWFyIGFib3V0IGl0IG9ubHkgd2hlbiB0aGUgc3RvcmVkIHRleHQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgcHVibGljIHNldExpc3RTZWFyY2goY29tcG9uZW50SWQ6IG51bWJlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2VhcmNoID0gbGlzdFNlYXJjaFRleHQodGV4dCk7XG5cbiAgICBpZiAoc2VhcmNoID09PSAodGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnRJZCkgPz8gJycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdFNlYXJjaENoYW5nZWQkLm5leHQoY29tcG9uZW50SWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW4gbmFtZXMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdDsgbm9uZSB3aGVuIGl0IHNob3dzIHRoZW0gYWxsLlxuICBwdWJsaWMgaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxpc3RIaWRkZW4oKS5nZXQoY29tcG9uZW50SWQpID8/IFtdO1xuICB9XG5cbiAgLy8gUmVjb3JkcyB0aGUgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBsaXN0LCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zOlxuICAvLyBuYW1lcyB0aGUgbGlzdCBjYW5ub3QgaGlkZSBhcmUgZHJvcHBlZCwgYW5kIG5vbmUgKG9yIGV2ZXJ5IGNvbHVtbikgY2xlYXJzXG4gIC8vIHRoZSBlbnRyeS4gT25seSBjaGFuZ2VzKCkgaGVhcnMgYWJvdXQgaXQsIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXRIaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkOiBudW1iZXIsIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGhpZGRlbiA9IGxpc3RIaWRkZW5Db2x1bW5zKHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk/LmNvbmZpZywgbmFtZXMpO1xuXG4gICAgaWYgKHNhbWVOYW1lcyhoaWRkZW4sIHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5saXN0SGlkZGVuKCkpO1xuXG4gICAgaWYgKGhpZGRlbi5sZW5ndGgpIHtcbiAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBoaWRkZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXh0KTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIG9uZSBsaXN0J3Mgc2VhcmNoIHRleHQgY2hhbmdlcywgc28gdGhhdCBsaXN0IHJlZmV0Y2hlcy5cbiAgcHVibGljIGxpc3RTZWFyY2hDaGFuZ2VzKGNvbXBvbmVudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNlYXJjaENoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGlkKSA9PiBpZCA9PT0gY29tcG9uZW50SWQpLFxuICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgdmlld2VyIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQ6IGEgZ3JvdXAgdmFsdWUsIHRoZVxuICAvLyBncmFpbiwgdGhlIG1hdGNoLCB0aGUgcGFnZSwgYSBsaXN0IHNvcnQsIHNlYXJjaCBvciBoaWRkZW4gY29sdW1ucywgYVxuICAvLyBkcmlsbCBwYXRoLCBhIHJlc2V0IG9yIGEgKHJlKWxvYWQgb2YgdGhlIHJlcG9ydC5cbiAgcHVibGljIGNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuaW5nIGEga2V5d29yZCBmaWx0ZXIgYmFjayBvbiB0YWtlcyBpdHMgbGlzdCdzIHNlYXJjaCBib3ggYXdheSwgYW5kXG4gICAgLy8gdGhlIHNlYXJjaCB3aXRoIGl0LiBUaGUgbGlzdCByZWZldGNoZXMgb24gdGhlIGdyb3VwIGNoYW5nZSBiZWxvdy5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBPTkUgY29tcG9uZW50OiBhbnkgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIGl0c1xuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gKG9yIGEgZnVsbCByZS1pbml0KS5cbiAgcHVibGljIGNoYW5nZXNGb3IoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQoKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiBncm91cElkID09PSBudWxsIHx8IGdyb3VwSWRzLmhhcyhncm91cElkKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBBTlkgb2YgYSBzZXQgb2YgY29tcG9uZW50cyB0aGF0IGNvbWVzIGFuZCBnb2VzXG4gIC8vIChhIHBhZ2UncyB2YWx1ZXMpOiBhIGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiB0aGVpciBmaWx0ZXJzIGJlbG9uZ3MgdG8uXG4gIC8vIFVubGlrZSBjaGFuZ2VzRm9yLCB0aGUgc2V0IGlzIHJlYWQgb24gZWFjaCBldmVudCByYXRoZXIgdGhhbiBjYXB0dXJlZCBhdFxuICAvLyBzdWJzY3JpYmUsIHNvIG9uZSBzdWJzY3JpcHRpb24gZm9sbG93cyB0aGUgc2V0IGFzIHRoZSByZXBvcnQgcmVsb2Fkcy4gQVxuICAvLyBmdWxsIHJlLWluaXQgKG51bGwpIGlzIG5vdCBwYXNzZWQgb246IGluaXQoKSBydW5zIG9uIGEgcmVwb3J0XG4gIC8vIChyZSlsb2FkLCBhbmQgYSBjYWxsZXIgb2YgdGhpcyBjaGVja3Mgb24gdGhhdCByZWxvYWQgaXRzZWxmIHdoZXRoZXIgdGhlXG4gIC8vIGZpbHRlciB2YWx1ZXMgaXRzIGNvbXBvbmVudHMgYXJlIHJlYWQgd2l0aCBtb3ZlZC5cbiAgcHVibGljIGNoYW5nZXNGb3JBbnkoY29tcG9uZW50czogKCkgPT4gUmVwb3J0Q29tcG9uZW50W10pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKTogZ3JvdXBJZCBpcyBudW1iZXIgPT4gZ3JvdXBJZCAhPT0gbnVsbFxuICAgICAgICAgICYmIGNvbXBvbmVudHMoKS5zb21lKChjb21wb25lbnQpID0+IChjb21wb25lbnQuZmlsdGVycyA/PyBbXSlcbiAgICAgICAgICAgIC5zb21lKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkID09PSBncm91cElkKSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBncm91cCB2YWx1ZXMgcmVzb2x2ZWQgaW50byB0aGlzIGNvbXBvbmVudCdzIG1lbWJlci1maWx0ZXIgdmFsdWVzIOKAlFxuICAvLyB3aGF0IHRoZSBkYXRhIHJlcXVlc3QgY2Fycmllcy4gRGlzYWJsZWQgZmlsdGVycyAoYXV0aG9yZWQgb3Igc2Vzc2lvbikgYXJlXG4gIC8vIHNraXBwZWQgZW50aXJlbHkuXG4gIHB1YmxpYyByZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBjb21wb25lbnQuZmlsdGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFmaWx0ZXIuZW5hYmxlZCB8fCB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlci5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB2YWx1ZSA/IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKSA6IG51bGw7XG5cbiAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgcmVzb2x2ZWQucHVzaCh7IGZpbHRlcklkOiBmaWx0ZXIuaWQsIC4uLmZpZWxkcyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIHNldCwgb25lIGVudHJ5IHBlciBmaWx0ZXIgZ3JvdXAsIGZvciB0aGUgcmVwb3J0IGNoYXQ6XG4gIC8vIHRoZSBhZ2VudCByZWFkcyBpdCB0byBrbm93IHdoYXQgaXMgb24gc2NyZWVuLiBHcm91cCBvcmRlciwgbm90IHRoZSBvcmRlclxuICAvLyB0aGUgdmFsdWVzIHdlcmUgc2V0IGluLCBzbyB0aGUgc2FtZSBzdGF0ZSBhbHdheXMgcmVhZHMgdGhlIHNhbWUuIEEgZ3JvdXBcbiAgLy8gd2l0aCBub3RoaW5nIGluIGl0IGlzIGxlZnQgb3V0LCBhbmQgYSBzYXZlZCBkZWZhdWx0IGNvdW50cyB1bnRpbCB0aGVcbiAgLy8gdmlld2VyIGNoYW5nZXMgaXQuIFBlci1maWx0ZXIgdG9nZ2xlcyBhcmUgYSBjb21wb25lbnQncyBvd24gYnVzaW5lc3MsIHNvXG4gIC8vIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgdmlld2VyRmlsdGVycygpOiBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fdmFsdWVzLmVudHJpZXMoKV1cbiAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpXG4gICAgICAubWFwKChbZ3JvdXBJZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gZmllbGRzID8geyBncm91cElkLCAuLi5maWVsZHMgfSA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyID0+IGVudHJ5ICE9PSBudWxsKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IHRpbGUncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIE9ubHkgYSB0aWxlIGJlY29tZXMgYSBmaWxlIChpc1RpbGUpLCBzbyBubyBvdGhlclxuICAvLyBjb21wb25lbnQncyBlbnRyaWVzIHJpZGUgYWxvbmcuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gaXNUaWxlKGNvbXBvbmVudCkpXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UGFnZShwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocGFnZUlkID09PSB0aGlzLl9wYWdlSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgY2hhbmdlIG9mIG1hdGNoIGNhbiBjaGFuZ2UgZXZlcnkgdGlsZSBhIGdyb3VwIHdpdGggYSB2YWx1ZSBuYXJyb3dzLCBzb1xuICAvLyBldmVyeSB0aWxlIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TWF0Y2gobWF0Y2g6IFJlcG9ydEZpbHRlck1hdGNoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dDogUmVwb3J0RmlsdGVyTWF0Y2ggPSBtYXRjaCA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLl9tYXRjaCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWF0Y2guc2V0KG5leHQpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0OyBlbXB0eSB3aGlsZSB0aGUgY2hhcnQgaXMgYXQgaXRzIHRvcC5cbiAgLy8gSXQgcmVhZHMgYSBzaWduYWwsIHNvIGEgdGVtcGxhdGUgdGhhdCBzaG93cyBpdCByZXBhaW50cyB3aGVuIGl0IG1vdmVzLlxuICBwdWJsaWMgZHJpbGwoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZHJpbGxzKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBjaGFydCdzIGRyaWxsIHBhdGgsIGtlcHQgdG8gY2xlYW5EcmlsbFBhdGg7IGFuIGVtcHR5IHBhdGggaXNcbiAgLy8gdGhlIGNoYXJ0J3MgdG9wLiBPbmx5IGEgY2hhcnQgb2YgdGhlIG9wZW4gcmVwb3J0IGRyaWxsczogYSBwYXRoIGZvciBhbnlcbiAgLy8gb3RoZXIgY29tcG9uZW50IGlzIGlnbm9yZWQuIE9ubHkgdGhhdCBjaGFydCBhbmQgY2hhbmdlcygpIGhlYXIgYWJvdXQgaXQsXG4gIC8vIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXREcmlsbChjb21wb25lbnRJZDogbnVtYmVyLCBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSBjbGVhbkRyaWxsUGF0aChwYXRoKTtcbiAgICBpZiAoIXRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpIHx8IHNhbWVEcmlsbFBhdGgoa2VwdCwgdGhpcy5kcmlsbChjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RHJpbGxQYXRoKGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICB0aGlzLl9kcmlsbENoYW5nZWQkLm5leHQoY29tcG9uZW50SWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGNoYXJ0J3MgZHJpbGwgcGF0aCBjaGFuZ2VzLCBzbyB0aGF0IGNoYXJ0IHJlZmV0Y2hlcy5cbiAgcHVibGljIGRyaWxsQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RyaWxsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRha2VzIHRoZSBkcmlsbCBwYXRoIGEgY2hhcnQncyBhbnN3ZXIgYXBwbGllZCBhcyB0aGUgY2hhcnQncyBvd246IHRoZVxuICAvLyBzZXJ2ZXIga2VlcHMgdGhlIGxvbmdlc3QgcGFydCBvZiBhIHNlbnQgcGF0aCBpdCBjYW4gYXBwbHksIHNvIGEgbGF0ZXJcbiAgLy8gc2F2ZSBob2xkcyB0aGF0IHBhcnQgb25seS4gVGhlIGNoYXJ0IGhhcyBqdXN0IHJlYWQgdGhhdCBwYXRoLCBzbyBvbmx5XG4gIC8vIGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdC4gVHJ1ZSB3aGVuIHRoZSBwYXRoIGNoYW5nZWQuXG4gIHB1YmxpYyBhZG9wdERyaWxsKGNvbXBvbmVudElkOiBudW1iZXIsIHBhdGg6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2VwdCA9IGNsZWFuRHJpbGxQYXRoKHBhdGgpO1xuICAgIGlmICghdGhpcy5faXNDaGFydChjb21wb25lbnRJZCkgfHwgc2FtZURyaWxsUGF0aChrZXB0LCB0aGlzLmRyaWxsKGNvbXBvbmVudElkKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBUaGUgbGF5b3V0IGEgdGFibGUgdGlsZSBpcyBvbiBzY3JlZW4gaW46IHRoZSB2aWV3ZXIncyBvd24gd2hpbGUgdGhleVxuICAvLyBjaGFuZ2VkIGl0IGZyb20gdGhlIGxheW91dCBhdXRob3JlZCBub3csIGVsc2UgdGhlIGF1dGhvcmVkIG9uZS4gSXQgcmVhZHNcbiAgLy8gYSBzaWduYWwsIHNvIGEgdGlsZSB0aGF0IHNob3dzIGl0IHJlZHJhd3Mgd2hlbiBlaXRoZXIgbW92ZXMuXG4gIHB1YmxpYyBncmlkTGF5b3V0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZExheW91dCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KSA/PyBhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8vIFRoZSB2aWV3ZXIncyBvd24gbGF5b3V0IG9mIGEgdGFibGUgdGlsZSB3aGlsZSBpdCBkaWZmZXJzIGZyb20gdGhlIGxheW91dFxuICAvLyBhdXRob3JlZCBub3csIGVsc2UgbnVsbDogdGhlIHRpbGUgc2hvd3MgaXRzIHN0b3JlZCBsYXlvdXQuIFRoZSBjaGF0XG4gIC8vIHNlbmRzIGl0IGFzIHRoZSB0aWxlJ3MgbGF5b3V0LlxuICBwdWJsaWMgZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBHcmlkTGF5b3V0IHwgbnVsbCB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX2dyaWRMYXlvdXRzKCkuZ2V0KGNvbXBvbmVudC5pZCk7XG5cbiAgICByZXR1cm4gc2Vzc2lvbj8uYmFzZSA9PT0gZ3JpZExheW91dEtleShhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KSlcbiAgICAgID8gc2Vzc2lvbi5sYXlvdXRcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgdGhlIGxheW91dCBhIHZpZXdlciBwdXQgYSB0YWJsZSB0aWxlIGluIChhIHJlLXBpdm90LCBhIHNvcnQsIGFcbiAgLy8gY29sdW1uIGZpbHRlcikuIE9uZSB0aGF0IGRyYXdzIHRoZSBhdXRob3JlZCBsYXlvdXQgY2xlYXJzIHRoZSBlbnRyeSwgc29cbiAgLy8gdGhlIHRpbGUgcmVhZHMgYXMgc3RvcmVkIGFnYWluLiBmcy1ncmlkIHJlYWRzIHRoZSBjaGFuZ2UgaXRzZWxmLCBzbyBvbmx5XG4gIC8vIGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdCwgYW5kIG9ubHkgb24gYSByZWFsIGNoYW5nZS5cbiAgcHVibGljIHNldEdyaWRMYXlvdXQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGxheW91dDogR3JpZExheW91dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wdXRHcmlkTGF5b3V0KGNvbXBvbmVudCwgbGF5b3V0KSkge1xuICAgICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGNvbHVtbiBmaWx0ZXIgYSBncm91cC1ieSBjaGFuZ2UgdG9vayBvdXQgb2YgYSB0YWJsZSB0aWxlLCBvciBudWxsXG4gIC8vIChfZ3JpZENsZWFyZWRGaWx0ZXJzKS5cbiAgcHVibGljIGdyaWRDbGVhcmVkRmlsdGVyKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZENsZWFyZWRGaWx0ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzKCkuZ2V0KGNvbXBvbmVudC5pZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBncm91cHMgYSB2aWV3ZXIgbGVmdCBvcGVuIGluIGEgdGFibGUgdGlsZSwgb3IgdW5kZWZpbmVkOiB0aGUgdGlsZVxuICAvLyBvcGVucyBhcyBpdHMgbGF5b3V0IHNheXMuXG4gIHB1YmxpYyBncmlkRXhwYW5zaW9uKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZEV4cGFuc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRFeHBhbnNpb25zKCkuZ2V0KGNvbXBvbmVudC5pZCk7XG4gIH1cblxuICAvLyBSZWNvcmRzIHRoZSBncm91cHMgb3BlbiBpbiBhIHRhYmxlIHRpbGUsIGFzIGZzLWdyaWQgd3JpdGVzIHRoZW0gb3V0LiBJdFxuICAvLyBjaGFuZ2VzIG5vIHJlYWQsIHNvIG5vdGhpbmcgaGVhcnMgYWJvdXQgaXQuXG4gIHB1YmxpYyBzZXRHcmlkRXhwYW5zaW9uKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBleHBhbnNpb246IEdyaWRFeHBhbnNpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgIT09ICdncmlkJyB8fCAhZXhwYW5zaW9uIHx8IHRoaXMuX2dyaWRFeHBhbnNpb25zKCkuZ2V0KGNvbXBvbmVudC5pZCkgPT09IGV4cGFuc2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2dyaWRFeHBhbnNpb25zLnNldChuZXcgTWFwKHRoaXMuX2dyaWRFeHBhbnNpb25zKCkpLnNldChjb21wb25lbnQuaWQsIGV4cGFuc2lvbikpO1xuICB9XG5cbiAgLy8gVGhlIGR1cmFibGUgc3RhdGUgb24gc2NyZWVuIGFzIG9uZSBkb2N1bWVudDogdGhlIHBhZ2UsIGV2ZXJ5IGdyb3VwIHRoZVxuICAvLyByZXBvcnQgaGFzIChudWxsIHdoZW4gaXQgaG9sZHMgbm90aGluZywgYSBjbGVhcmVkIGRlZmF1bHQgaW5jbHVkZWQpLCB0aGVcbiAgLy8gbWF0Y2gsIHRoZSBncmFpbiwgYW5kIGVhY2ggdGlsZSdzIHNvcnQsIHNlYXJjaCwgaGlkZGVuIGNvbHVtbnMgYW5kIGRyaWxsXG4gIC8vIHBhdGggd2hlcmUgdGhleSBkaWZmZXIgZnJvbSB0aGUgYXV0aG9yZWQgdGlsZS4gQSBkYXRlIHJhbmdlIHRoYXQgc3RpbGxcbiAgLy8gY2FycmllcyBpdHMgcmVsYXRpdmUgcHJlc2V0IGlzIHdyaXR0ZW4gYXMgdGhhdCBwcmVzZXQsIHdoYXRldmVyIHRvZGF5IGlzXG4gIC8vICh0b1N0b3JlZEdyb3VwVmFsdWUpLiBUaGUgdGVtcG9yYXJ5IGxheWVyIGlzIG5ldmVyIHBhcnQgb2YgaXQuXG4gIHB1YmxpYyBzbmFwc2hvdCgpOiBSZXBvcnRTdGF0ZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogUmVwb3J0U3RhdGVTbmFwc2hvdCA9IHt9O1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpKSB7XG4gICAgICBzbmFwc2hvdC5wYWdlSWQgPSB0aGlzLl9wYWdlSWQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZnJlcXVlbmN5KSB7XG4gICAgICBzbmFwc2hvdC5ncm91cEJ5ID0gdGhpcy5fZnJlcXVlbmN5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXRjaCgpID09PSAnYW55Jykge1xuICAgICAgc25hcHNob3QubWF0Y2ggPSAnYW55JztcbiAgICB9XG5cbiAgICBzbmFwc2hvdC5ncm91cHMgPSB0aGlzLl9zbmFwc2hvdEdyb3VwcygpO1xuXG4gICAgY29uc3QgdGlsZXMgPSB0aGlzLl9zbmFwc2hvdFRpbGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRpbGVzKS5sZW5ndGgpIHtcbiAgICAgIHNuYXBzaG90LnRpbGVzID0gdGlsZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzIGFzIGEgc25hcHNob3Q6IGV2ZXJ5IGdyb3VwIGF0IGl0cyBhdXRob3JlZFxuICAvLyBkZWZhdWx0IChudWxsIHdoZW4gaXQgaGFzIG5vbmUpLCBubyBtYXRjaCwgZ3JhaW4gb3IgdGlsZSBzdGF0ZS5cbiAgcHVibGljIGF1dGhvcmVkQ29uZmlnKCk6IFJlcG9ydFN0YXRlU25hcHNob3Qge1xuICAgIGNvbnN0IGdyb3VwczogUmVjb3JkPG51bWJlciwgRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbD4gPSB7fTtcblxuICAgIHRoaXMuX2dyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgZ3JvdXBzW2dyb3VwLmlkXSA9IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGdyb3VwcyB9O1xuICB9XG5cbiAgLy8gUHV0cyB0aGUgc2NyZWVuIGJhY2sgb24gdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzIG9uIHRoZSBwYWdlIGl0IGlzXG4gIC8vIG9uOiBldmVyeSBncm91cCBhdCBpdHMgZGVmYXVsdCwgbWF0Y2ggJ2FsbCcsIG5vIGdyYWluLCBhbmQgZXZlcnkgdGlsZSBhdFxuICAvLyBpdHMgYXV0aG9yZWQgc29ydCwgc2VhcmNoLCBjb2x1bW5zIGFuZCB0b3AuIENsZWFycyB0aGUgdGVtcG9yYXJ5IGxheWVyLlxuICAvLyBUaGUgdGlsZXMgc3RheSBhbmQgcmVsb2FkIGluIHBsYWNlLCBleGNlcHQgYSBsaXN0IHdob3NlIHNvcnQgdGhpcyBtb3ZlZFxuICAvLyAobGlzdFNvcnRSZXNldHMpLiBFdmVyeSBjaGFuZ2UgaXMgYW5ub3VuY2VkIG9uY2UsIGF0IHRoZSBlbmQuXG4gIHB1YmxpYyByZXNldFRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZnJlcXVlbmN5O1xuICAgIGNvbnN0IHNvcnRzID0gbmV3IE1hcCh0aGlzLl9saXN0U29ydHMpO1xuXG4gICAgdGhpcy5fdGVtcG9yYXJ5LnNldChlbXB0eVRlbXBvcmFyeVN0YXRlKCkpO1xuICAgIHRoaXMuX2dyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gdGhpcy5fc2VlZEF1dGhvcmVkKGdyb3VwKSk7XG4gICAgdGhpcy5fbWF0Y2guc2V0KCdhbGwnKTtcbiAgICB0aGlzLl9mcmVxdWVuY3kgPSBudWxsO1xuICAgIHRoaXMuX2NsZWFyVGlsZXMoKTtcbiAgICB0aGlzLl9jb3VudFNvcnRSZXNldHMoc29ydHMpO1xuICAgIHRoaXMuX25vdGlmeVJlc2V0KGZyZXF1ZW5jeSk7XG4gIH1cblxuICAvLyBQdXRzIG9ubHkgYGdyb3VwSWRzYCBiYWNrIG9uIHRoZWlyIGF1dGhvcmVkIGRlZmF1bHRzLiBBIHRpbGUgaGVhZGVyJ3NcbiAgLy8gJ0NsZWFyIGZpbHRlcnMnIG93bnMgb25seSBpdHMgb3duIGdyb3VwczsgdGhlIHJlcG9ydCBiYXIncyBjYWxsc1xuICAvLyByZXNldFRvRGVmYXVsdHMoKS4gRWFjaCBncm91cCBpcyBhbm5vdW5jZWQgYXMgYSB2aWV3ZXIncyBjaGFuZ2UgdG8gaXQgaXMsXG4gIC8vIHNvIHRoZSB0aWxlcyBpbiBpdCByZWZldGNoIGFuZCBhIGJhciBzaG93aW5nIGl0IHdpdGggYW5vdGhlciB2YWx1ZSBpc1xuICAvLyBidWlsdCBhZ2Fpbi5cbiAgcHVibGljIHJlc2V0R3JvdXBzVG9EZWZhdWx0cyhncm91cElkczogcmVhZG9ubHkgbnVtYmVyW10pOiB2b2lkIHtcbiAgICBncm91cElkcy5mb3JFYWNoKChncm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2VlZEF1dGhvcmVkKGdyb3VwKTtcbiAgICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgb25lIG9mIGBncm91cElkc2Agc2hvd3MgYSB2YWx1ZSBvdGhlciB0aGFuIGl0cyBhdXRob3JlZCBkZWZhdWx0LFxuICAvLyB0aGUgdmFsdWUgcmVzZXRHcm91cHNUb0RlZmF1bHRzKCkgcHV0cyBiYWNrLiBBIHRpbGUgaGVhZGVyJ3MgQ2xlYXIgY2hpcFxuICAvLyBzaG93cyBleGFjdGx5IHdoaWxlIG9uZSBvZiBpdHMgb3duIGdyb3VwcyBkb2VzLiBJdCByZWFkcyB0aGUgcmV2aXNpb25cbiAgLy8gZGlmZmVyc0Zyb21EZWZhdWx0cyByZWFkcywgc28gYSBjYWxsZXIgb24gZWFjaCBjaGVjayBvZiBhbiBPblB1c2ggdmlld1xuICAvLyBzdGF5cyBjdXJyZW50LlxuICBwdWJsaWMgZ3JvdXBzRGlmZmVyRnJvbURlZmF1bHRzKGdyb3VwSWRzOiByZWFkb25seSBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3JldmlzaW9uKCk7XG5cbiAgICByZXR1cm4gZ3JvdXBJZHMuc29tZSgoZ3JvdXBJZCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhvcmVkID0gdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCkpO1xuICAgICAgY29uc3Qgc2NyZWVuID0gdGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXBJZCkgPyBudWxsIDogdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCkpO1xuXG4gICAgICByZXR1cm4gIXNhbWVTdG9yZWRHcm91cFZhbHVlKGF1dGhvcmVkLCBzY3JlZW4pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGludGVyYWN0aW9uIHN0YXRlIGEgdGlsZSdzIGRhdGEgcmVxdWVzdCBjYXJyaWVzIG5vdzogdGlsZURhdGFTdGF0ZVxuICAvLyBvdmVyIHRoZSBvcGVuIHJlcG9ydCBhbmQgdGhlIHNjcmVlbidzIHNuYXBzaG90KCkuXG4gIHB1YmxpYyB0aWxlU3RhdGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBDb21wb25lbnREYXRhU3RhdGUge1xuICAgIHJldHVybiB0aWxlRGF0YVN0YXRlKHRoaXMuX3JlcG9ydCgpLCBjb21wb25lbnQsIHRoaXMuc25hcHNob3QoKSk7XG4gIH1cblxuICAvLyBUaGUgcmVsYXRpdmUgcmFuZ2UgYSBncm91cCdzIHZhbHVlIHN0aWxsIGlzLCBhcyBhIGRhdGEgcmVxdWVzdCBuYW1lcyBpdFxuICAvLyAoaXRzIHByZXNldCB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSksIG9yIG51bGwuIFRoZVxuICAvLyBleHBvcnQgd29yZGluZyBuYW1lcyBhIGxpdmUgcHJlc2V0IGJ5IGl0LlxuICBwdWJsaWMgbGl2ZVByZXNldChncm91cElkOiBudW1iZXIpOiBSZXBvcnRSZWxhdGl2ZVJhbmdlIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpO1xuXG4gICAgcmV0dXJuIHZhbHVlID8gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSkgOiBudWxsO1xuICB9XG5cbiAgLy8gQSBncm91cCB2YWx1ZSBhcyB0aGUgZmllbGRzIGEgcmVxdWVzdCBjYXJyaWVzOiBkYXRlIGJvdW5kcyBhcyBjYWxlbmRhclxuICAvLyBkYXlzLCBzZWxlY3QgdmFsdWVzIHdoZW4gYW55IGFyZSBwaWNrZWQgKGVsc2UgdGhlIHZhbHVlcyBsZWZ0IG91dCksXG4gIC8vIGtleXdvcmQgdGV4dCB0cmltbWVkLCBhIG51bWJlciByYW5nZSdzIGVuZHMuIE51bGwgd2hlbiBhbGwgb2YgdGhlbSBhcmVcbiAgLy8gZW1wdHkuIEEgZGF0ZSByYW5nZSBhbHNvIG5hbWVzIHRoZSByZWxhdGl2ZSByYW5nZSBpdCBzdGlsbCBpc1xuICAvLyAoX2xpdmVQcmVzZXQpLCBzbyB0aGUgc2VydmVyIGtub3dzIHdoaWNoIHBlcmlvZCB0aGUgZGF5cyBjb3ZlcjtcbiAgLy8gdGhlIGRheXMgc3RheSB0aGUgd2luZG93IGVpdGhlciB3YXkuIENvbXBvbmVudCBkYXRhLCB0aGUgcmVwb3J0IGFuZCBwYWdlXG4gIC8vIGV4cG9ydHMgYW5kIHRoZSBjaGF0J3Mgdmlld2VyIGZpbHRlcnMgYWxsIHJlYWQgdGhlaXIgZmllbGRzIGhlcmUsIHNvIGFsbFxuICAvLyB0aHJlZSBjYXJyeSBpdC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHByZXNldCkge1xuICAgICAgZmllbGRzLnByZXNldCA9IHByZXNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc29sdmVFeGNsdWRlQW5kUmFuZ2UodmFsdWUsIGZpZWxkcyk7XG5cbiAgICByZXR1cm4gZmllbGRzLnN0YXJ0IHx8IGZpZWxkcy5lbmQgfHwgZmllbGRzLnZhbHVlcyB8fCBmaWVsZHMudmFsdWVcbiAgICAgIHx8IGZpZWxkcy5leGNsdWRlVmFsdWVzIHx8IGZpZWxkcy5taW4gIT09IHVuZGVmaW5lZCB8fCBmaWVsZHMubWF4ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZmllbGRzXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBUaGUgcmVsYXRpdmUgcmFuZ2UgYSBkYXRlIHZhbHVlIHN0aWxsIGlzOiB0aGUgcHJlc2V0IG5hbWUgaXQgY2FycmllcyxcbiAgLy8gd2hpbGUgaXRzIGRheXMgYXJlIHRoYXQgcmFuZ2UgcmVzb2x2ZWQgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUuIEFcbiAgLy8gdmFsdWUgd2hvc2UgZGF5cyB0aGUgdmlld2VyIGNoYW5nZWQsIG9yIG9uZSBzZWVkZWQgYmVmb3JlIG1pZG5pZ2h0IHRoYXRcbiAgLy8gaXMgbm93IGEgZGF5IGJlaGluZCwgbmFtZXMgbm9uZSwgYW5kIHRoZSBzZXJ2ZXIgcmVhZHMgaXRzIGRheXMgYWxvbmUuXG4gIHByaXZhdGUgX2xpdmVQcmVzZXQodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBSZXBvcnRSZWxhdGl2ZVJhbmdlIHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZS5wcmVzZXQgfHwgIWlzUmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZSA9IHRoaXMuX3JlbGF0aXZlUmFuZ2UodmFsdWUucHJlc2V0KTtcblxuICAgIHJldHVybiByYW5nZSAmJiBzYW1lRGF5cyh2YWx1ZSwgcmFuZ2UpID8gdmFsdWUucHJlc2V0IDogbnVsbDtcbiAgfVxuXG4gIC8vIFNlZWRzIG9uZSBncm91cCBvbiAocmUpbG9hZDsgc2VlIGluaXQoKS4gYHByZXZpb3VzYCBpcyB0aGUgZ3JvdXAgYXMgdGhlXG4gIC8vIGxhc3QgbG9hZCBoYWQgaXQsIG9yIG51bGwgd2hlbiBpdCBpcyBuZXcuXG4gIHByaXZhdGUgX3NlZWQoXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHByZXZpb3VzOiBSZXBvcnRGaWx0ZXJHcm91cCB8IG51bGwsXG4gICAgdGltZXpvbmVDaGFuZ2VkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0Q2hhbmdlZCA9ICFzYW1lRGVmYXVsdChwcmV2aW91cz8uY29uZmlnPy5kZWZhdWx0ID8/IG51bGwsIGdyb3VwLmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsKTtcblxuICAgIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuICAgIGNvbnN0IHByZXNldFRvUmVzb2x2ZSA9IHRpbWV6b25lQ2hhbmdlZFxuICAgICAgJiYgISF2YWx1ZT8ucHJlc2V0XG4gICAgICAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmU7XG5cbiAgICBpZiAodmFsdWUgJiYgIWRlZmF1bHRDaGFuZ2VkICYmICFwcmVzZXRUb1Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgZGVmYXVsdFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGUgZGVmYXVsdCB3YXMgY2xlYXJlZCwgc28gdGhlIHZhbHVlIGl0IHNlZWRlZCBnb2VzIHdpdGggaXQuXG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFZhbHVlcyBpbmNsdWRlZDogb25lIGlzIG5ldmVyIGRyYXduLCBidXQgaXRzIGZpbHRlcnMgYXJlIHRoZSByZXBvcnQnc1xuICAgIC8vIGxpa2UgYW55IG90aGVyIGNvbXBvbmVudCdzLCBhbmQgc28gYXJlIHRoZWlyIHNlc3Npb24gdG9nZ2xlcy5cbiAgICBjb25zdCBmaWx0ZXJJZHMgPSBuZXcgU2V0KHJlcG9ydENvbXBvbmVudHMocmVwb3J0KVxuICAgICAgLmZsYXRNYXAoKGNvbXBvbmVudCkgPT4gKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmlkKSkpO1xuXG4gICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmZvckVhY2goKGZpbHRlcklkKSA9PiB7XG4gICAgICBpZiAoIWZpbHRlcklkcy5oYXMoZmlsdGVySWQpKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgY29uc3QgaGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPigpO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuKCkuZm9yRWFjaCgobmFtZXMsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBrZXB0ID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBuYW1lcyk7XG5cbiAgICAgIGlmIChrZXB0Lmxlbmd0aCkge1xuICAgICAgICBoaWRkZW4uc2V0KGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQoaGlkZGVuKTtcbiAgfVxuXG4gIC8vIFRoZSB2YWx1ZSBhIGJhciBzZXRzLCBrZWVwaW5nIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgd2hpbGUgdGhlIGRheXMgYXJlXG4gIC8vIHN0aWxsIHRoZSBzdG9yZWQgZGF5cyAoc2VlIHNldFZhbHVlKS5cbiAgcHJpdmF0ZSBfd2l0aFByZXNldChzdG9yZWQ6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogRmlsdGVyR3JvdXBWYWx1ZSB7XG4gICAgY29uc3QgZml4ZWQ6IEZpbHRlckdyb3VwVmFsdWUgPSB7IC4uLnZhbHVlIH07XG4gICAgZGVsZXRlIGZpeGVkLnByZXNldDtcblxuICAgIHJldHVybiBzdG9yZWQ/LnByZXNldCAmJiBzYW1lRGF5cyhzdG9yZWQsIGZpeGVkKVxuICAgICAgPyB7IC4uLmZpeGVkLCBwcmVzZXQ6IHN0b3JlZC5wcmVzZXQgfVxuICAgICAgOiBmaXhlZDtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RDb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiByZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jyk7XG4gIH1cblxuICAvLyBUaGUgY29sdW1ucyBhIGxpc3QgY2FuIGJlIHNvcnRlZCBieTogZXZlcnkgYXV0aG9yZWQgY29sdW1uLCBvciBhXG4gIC8vIGNyb3NzLXRhYidzIHJvdyBjb2x1bW4gb25seSAoaXRzIHBpdm90IGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YSkuXG4gIHByaXZhdGUgX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnO1xuXG4gICAgaWYgKGNvbmZpZz8ucGl2b3RCeT8uY29sdW1uKSB7XG4gICAgICByZXR1cm4gY29uZmlnLnJvd0J5Py5jb2x1bW4gPyBbY29uZmlnLnJvd0J5LmNvbHVtbl0gOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNvbmZpZz8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+IGNvbHVtbi5jb2x1bW4pO1xuICB9XG5cbiAgLy8gQSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIG1hcHBlZCB0byBhIHNlc3Npb24gdmFsdWUgYnkgdHlwZS4gUmVsYXRpdmVcbiAgLy8gZGF0ZSBwcmVzZXRzIHJlc29sdmUgYWdhaW5zdCBcIm5vd1wiIGVhY2ggdGltZSB0aGUgcmVwb3J0IG9wZW5zLCBzbyBhIHNhdmVkXG4gIC8vIFwibGFzdCAxMiBtb250aHNcIiBzdGF5cyByZWxhdGl2ZSBhbmQgY2FycmllcyBpdHMgcHJlc2V0IG5hbWU7IGEgZml4ZWRcbiAgLy8gcmFuZ2UsIHNlbGVjdCB2YWx1ZXMgYW5kIGtleXdvcmQgdGV4dCBzZWVkIHZlcmJhdGltLlxuICBwcml2YXRlIF9kZWZhdWx0VmFsdWUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSk7XG5cbiAgICAgIHJldHVybiByYW5nZSA/IHsgc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCwgcHJlc2V0OiBncm91cERlZmF1bHQucmVsYXRpdmUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGdyb3VwRGVmYXVsdC52YWx1ZXMgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogZ3JvdXBEZWZhdWx0LnZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVPclJhbmdlRGVmYXVsdChncm91cERlZmF1bHQpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgZ3JvdXAgaW4gaXRzIHN0b3JlZCBzaGFwZTogbnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgZGVmYXVsdFxuICAvLyB0aGUgdmlld2VyIGNsZWFyZWQgaW5jbHVkZWQuXG4gIHByaXZhdGUgX3NuYXBzaG90R3JvdXBzKCk6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+ID0ge307XG5cbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGdyb3Vwc1tncm91cC5pZF0gPSB0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZClcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICAvLyBFYWNoIHRpbGUncyBzdGF0ZSB3aGVyZSBpdCBkaWZmZXJzIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgbGlzdCBzb3J0XG4gIC8vIHRoYXQgaXMgdGhlIGxpc3QncyBhdXRob3JlZCBmaXJzdCB0ZXJtIGlzIGl0cyBkZWZhdWx0LCBub3QgYSBjaG9pY2UuXG4gIHByaXZhdGUgX3NuYXBzaG90VGlsZXMoKTogUmVjb3JkPG51bWJlciwgUmVwb3J0VGlsZVN0YXRlPiB7XG4gICAgY29uc3QgdGlsZXM6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuX3RpbGVzKCkpIHtcbiAgICAgIGNvbnN0IHRpbGU6IFJlcG9ydFRpbGVTdGF0ZSA9IHt9O1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3QgZHJpbGwgPSB0aGlzLmRyaWxsKGNvbXBvbmVudC5pZCk7XG5cbiAgICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICAgIHRpbGUuc29ydCA9IHsgLi4uc29ydCB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICB0aWxlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICAgIH1cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuaGlkZGVuID0gWy4uLmhpZGRlbl07XG4gICAgICB9XG4gICAgICBpZiAoZHJpbGwubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZHJpbGwgPSBkcmlsbC5tYXAoKHN0ZXApID0+ICh7IC4uLnN0ZXAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGlsZSkubGVuZ3RoKSB7XG4gICAgICAgIHRpbGVzW2NvbXBvbmVudC5pZF0gPSB0aWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aWxlcztcbiAgfVxuXG4gIC8vIEEgZ3JvdXAgYmFjayBhdCBpdHMgYXV0aG9yZWQgZGVmYXVsdC5cbiAgcHJpdmF0ZSBfc2VlZEF1dGhvcmVkKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcblxuICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwLmlkKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVyeSB0aWxlIGJhY2sgYXQgaXRzIGF1dGhvcmVkIHN0YXRlLlxuICBwcml2YXRlIF9jbGVhclRpbGVzKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTb3J0cy5jbGVhcigpO1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5jbGVhcigpO1xuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV3IE1hcCgpKTtcbiAgICB0aGlzLl9kcmlsbHMuc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5fZ3JpZExheW91dHMuc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzLnNldChuZXcgTWFwKCkpO1xuICB9XG5cbiAgLy8gc2V0R3JpZExheW91dCgpIHdpdGhvdXQgdGhlIGNoYW5nZSBldmVudDsgdHJ1ZSB3aGVuIHRoZSBsYXlvdXQgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfcHV0R3JpZExheW91dChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgbGF5b3V0OiBHcmlkTGF5b3V0KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmFzZSA9IGdyaWRMYXlvdXRLZXkoYXV0aG9yZWRHcmlkTGF5b3V0KGNvbXBvbmVudCkpO1xuICAgIGNvbnN0IGtleSA9IGdyaWRMYXlvdXRLZXkobGF5b3V0KTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ3JpZExheW91dHMoKS5nZXQoY29tcG9uZW50LmlkKTtcbiAgICBjb25zdCB1bmNoYW5nZWQgPSBrZXkgPT09IGJhc2VcbiAgICAgID8gIWN1cnJlbnRcbiAgICAgIDogY3VycmVudD8uYmFzZSA9PT0gYmFzZSAmJiBncmlkTGF5b3V0S2V5KGN1cnJlbnQubGF5b3V0KSA9PT0ga2V5O1xuXG4gICAgaWYgKGNvbXBvbmVudC50eXBlICE9PSAnZ3JpZCcgfHwgdW5jaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5fZ3JpZExheW91dHMoKSk7XG5cbiAgICBpZiAoa2V5ID09PSBiYXNlKSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnQuaWQsIHsgbGF5b3V0LCBiYXNlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2dyaWRMYXlvdXRzLnNldChuZXh0KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gRXZlcnkgdGFibGUgdGhhdCBmb2xsb3dzIHRoZSBncm91cC1ieSAoZm9sbG93c0dyb3VwQnkpLCBpdHMgY29sdW1uIGZpbHRlclxuICAvLyBvbiB0aGUgZ3JvdXAtYnkncyBmaWVsZCBtb3ZlZCB0byB0aGUgZ3JhaW4gaXQgbm93IHJlYWRzIGF0OiB0aGUgdmlld2VyJ3NcbiAgLy8gcGljaywgZWxzZSB0aGUgdGFibGUncyBvd24gKGdyYWluZWRHcmlkTGF5b3V0KCkpLiBUYWJsZXMgb24gb3RoZXIgcGFnZXNcbiAgLy8gbW92ZSB0b28sIHNvIHRoZWlyIGZpbGVzLCB0aGUgY2hhdCBhbmQgdGhlaXIgbmV4dCBwYWludCByZWFkIHRoZSBtb3ZlZFxuICAvLyBmaWx0ZXIuIEEgZmlsdGVyIHRha2VuIG91dCBpcyBub3RlZCBvbiBpdHMgdGlsZSAoZ3JpZENsZWFyZWRGaWx0ZXIoKSk7IGFcbiAgLy8gbm90ZSBhbHJlYWR5IHRoZXJlIG5hbWVzIHRoZSBuZXcgZ3JhaW4sIHVubGVzcyB0aGUgZmllbGQgaXMgZmlsdGVyZWRcbiAgLy8gYWdhaW4sIHdoaWNoIGVuZHMgaXQuXG4gIHByaXZhdGUgX2dyYWluR3JpZExheW91dHMoKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJlZCA9IG5ldyBNYXAodGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzKCkpO1xuXG4gICAgdGhpcy5fdGlsZXMoKS5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwQnkgPSBjb21wb25lbnQudHlwZSA9PT0gJ2dyaWQnID8gY29tcG9uZW50LmZvbGxvd3NHcm91cEJ5IDogbnVsbDtcbiAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5fZnJlcXVlbmN5ID8/IGdyb3VwQnk/LmdyYW51bGFyaXR5O1xuICAgICAgaWYgKCFncm91cEJ5IHx8ICFncmFudWxhcml0eSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyYWluZWQgPSBncmFpbmVkR3JpZExheW91dCh0aGlzLmdyaWRMYXlvdXQoY29tcG9uZW50KSwgZ3JvdXBCeS5maWVsZCwgZ3JhbnVsYXJpdHkpO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSAoZ3JhaW5lZC5sYXlvdXQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiBmaWx0ZXIuZmllbGQgPT09IGdyb3VwQnkuZmllbGQpO1xuICAgICAgY29uc3Qgbm90ZSA9IGdyYWluZWQuY2xlYXJlZCA/PyAoZmlsdGVyZWQgPyBudWxsIDogY2xlYXJlZC5nZXQoY29tcG9uZW50LmlkKSk7XG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBjbGVhcmVkLnNldChjb21wb25lbnQuaWQsIHsgLi4ubm90ZSwgZ3JhbnVsYXJpdHk6IEdSSURfR1JBTlVMQVJJVElFU1tncmFudWxhcml0eV0gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhcmVkLmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9wdXRHcmlkTGF5b3V0KGNvbXBvbmVudCwgZ3JhaW5lZC5sYXlvdXQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzLnNldChjbGVhcmVkKTtcbiAgfVxuXG4gIC8vIE9uZSBjaGFydCdzIGRyaWxsIHBhdGg7IGFuIGVtcHR5IHBhdGggaXMgdGhlIGNoYXJ0J3MgdG9wLlxuICBwcml2YXRlIF9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQ6IG51bWJlciwgcGF0aDogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLl9kcmlsbHMoKSk7XG5cbiAgICBpZiAocGF0aC5sZW5ndGgpIHtcbiAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyaWxscy5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBBZnRlciByZXNldFRvRGVmYXVsdHMoKTogZXZlcnkgYmFyIGFuZCB0aWxlIHJlcGFpbnRzLCBhbmQgdGhlIHRpbGVzIHRoYXRcbiAgLy8gZm9sbG93IHRoZSBncm91cC1ieSByZWZldGNoIHdoZW4gdGhlIGdyYWluIG1vdmVkLlxuICBwcml2YXRlIF9ub3RpZnlSZXNldChmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGVWZXJzaW9uLnVwZGF0ZSgodmVyc2lvbikgPT4gdmVyc2lvbiArIDEpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG5cbiAgICBpZiAoZnJlcXVlbmN5ICE9PSB0aGlzLl9mcmVxdWVuY3kpIHtcbiAgICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSB0aWxlcyBvZiB0aGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQuXG4gIHByaXZhdGUgX3RpbGVzKCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9yZXBvcnQoKTtcblxuICAgIHJldHVybiByZXBvcnRcbiAgICAgID8gcmVwb3J0Q29tcG9uZW50cyhyZXBvcnQpLmZpbHRlcihpc1RpbGUpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNDaGFydChjb21wb25lbnRJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbGVzKClcbiAgICAgIC5zb21lKChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCA9PT0gY29tcG9uZW50SWQgJiYgY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcpO1xuICB9XG5cbiAgLy8gRHJvcHMgZWFjaCB0YWJsZSBsYXlvdXQgYW5kIGV4cGFuc2lvbiB3aG9zZSB0aWxlIGlzIGdvbmUgb3IgaXMgbm8gdGFibGVcbiAgLy8gYW55IG1vcmUuIEEgbGF5b3V0IHdob3NlIHRpbGUgaXMgbm93IGF1dGhvcmVkIG90aGVyd2lzZSAoYW4gZWRpdCwgdGhlXG4gIC8vIGFnZW50J3MpIG1vdmVzIG9udG8gdGhlIG5ldyBhdXRob3JlZCBsYXlvdXQsIGtlZXBpbmcgdGhlIHZpZXdlcidzIGZpbHRlcnNcbiAgLy8gYW5kIHNvcnQgdGVybXMgb24gZmllbGRzIGl0IHN0aWxsIHBsYWNlcyAocmViYXNlZEdyaWRMYXlvdXQpLCBzbyB0aGUgdGlsZVxuICAvLyBzaG93cyBib3RoIGNoYW5nZXM7IG9uZSB0aGF0IHRoZW4gZHJhd3MgdGhlIGF1dGhvcmVkIGxheW91dCBpcyBkcm9wcGVkLlxuICBwcml2YXRlIF9wcnVuZUdyaWRMYXlvdXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyaWRzID0gbmV3IE1hcCh0aGlzLl90aWxlcygpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnZ3JpZCcpXG4gICAgICAubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcbiAgICBjb25zdCBrZXB0ID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEdyaWRTZXNzaW9uTGF5b3V0PigpO1xuXG4gICAgdGhpcy5fZ3JpZExheW91dHMoKS5mb3JFYWNoKChzZXNzaW9uLCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JpZHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aG9yZWQgPSBhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KTtcbiAgICAgIGNvbnN0IGJhc2UgPSBncmlkTGF5b3V0S2V5KGF1dGhvcmVkKTtcbiAgICAgIGNvbnN0IGxheW91dCA9IHNlc3Npb24uYmFzZSA9PT0gYmFzZSA/IHNlc3Npb24ubGF5b3V0IDogcmViYXNlZEdyaWRMYXlvdXQoc2Vzc2lvbi5sYXlvdXQsIHNlc3Npb24uYmFzZSwgYXV0aG9yZWQpO1xuXG4gICAgICBpZiAoZ3JpZExheW91dEtleShsYXlvdXQpICE9PSBiYXNlKSB7XG4gICAgICAgIGtlcHQuc2V0KGNvbXBvbmVudElkLCB7IGxheW91dCwgYmFzZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2dyaWRMYXlvdXRzLnNldChrZXB0KTtcbiAgICB0aGlzLl9ncmlkRXhwYW5zaW9ucy5zZXQobmV3IE1hcChbLi4udGhpcy5fZ3JpZEV4cGFuc2lvbnMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IGdyaWRzLmhhcyhjb21wb25lbnRJZCkpKSk7XG4gICAgdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzLnNldChuZXcgTWFwKFsuLi50aGlzLl9ncmlkQ2xlYXJlZEZpbHRlcnMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IGdyaWRzLmhhcyhjb21wb25lbnRJZCkpKSk7XG4gIH1cblxuICAvLyBLZWVwcyB0aGUgcGFnZSwgZHJpbGwgYW5kIHRhYmxlIHN0YXRlIHRvIHdoYXQgdGhlIHJlcG9ydCAocmUpbG9hZGVkIGJ5XG4gIC8vIGluaXQoKSBzdGlsbCBoYXM6IGRyaWxsIHBhdGhzIG9uIGNoYXJ0cyBpdCBzdGlsbCBoYXMsIHRoZSBwYWdlIHdoaWxlIGl0XG4gIC8vIGhhcyBpdCwgYW5kIGVhY2ggdGFibGUncyBsYXlvdXQgYW5kIG9wZW4gZ3JvdXBzIHdoaWxlIGl0IGlzIHN0aWxsIGEgdGFibGVcbiAgLy8gKF9wcnVuZUdyaWRMYXlvdXRzKS4gT24gYW5vdGhlciByZXBvcnQgaXQgc3RhcnRzIGFnYWluOiBtYXRjaCAnYWxsJywgbm9cbiAgLy8gZHJpbGwsIGV2ZXJ5IHRhYmxlIGFzIGF1dGhvcmVkIGFuZCBjbG9zZWQsIGFuZCBub3RoaW5nIHRlbXBvcmFyeS5cbiAgcHJpdmF0ZSBfcHJ1bmVQYWdlU3RhdGUocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVwb3J0KCk/LmlkICE9PSByZXBvcnQuaWQpIHtcbiAgICAgIHRoaXMuX21hdGNoLnNldCgnYWxsJyk7XG4gICAgICB0aGlzLl9wYWdlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKCkpO1xuICAgICAgdGhpcy5fZ3JpZExheW91dHMuc2V0KG5ldyBNYXAoKSk7XG4gICAgICB0aGlzLl9ncmlkRXhwYW5zaW9ucy5zZXQobmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuX2dyaWRDbGVhcmVkRmlsdGVycy5zZXQobmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuX3RlbXBvcmFyeS5zZXQoZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKFsuLi50aGlzLl9kcmlsbHMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IHRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpKSkpO1xuICAgIHRoaXMuX3BydW5lR3JpZExheW91dHMoKTtcbiAgICAvLyBBIHRhYmxlIHRoZSByZXBvcnQgbm93IGF1dGhvcnMgb3RoZXJ3aXNlIHJlYWRzIGF0IHRoZSBncmFpbiBvbiBzY3JlZW4uXG4gICAgdGhpcy5fZ3JhaW5HcmlkTGF5b3V0cygpO1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpICYmICEocmVwb3J0LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiBwYWdlLmlkID09PSB0aGlzLl9wYWdlSWQoKSkpIHtcbiAgICAgIHRoaXMuX3BhZ2VJZC5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBzZWxlY3QncyB2YWx1ZXMgdG8gbGVhdmUgb3V0IChvbmx5IHdoZW4gaXQga2VlcHMgbm9uZSkgYW5kIGEgbnVtYmVyXG4gIC8vIHJhbmdlJ3MgZW5kcywgYW4gb3BlbiBlbmQgbGVmdCBvdXQgYW5kIDAga2VwdCwgd3JpdHRlbiBvbnRvIGBmaWVsZHNgLlxuICBwcml2YXRlIF9yZXNvbHZlRXhjbHVkZUFuZFJhbmdlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlLCBmaWVsZHM6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuZXhjbHVkZVZhbHVlcz8ubGVuZ3RoICYmICFmaWVsZHMudmFsdWVzKSB7XG4gICAgICBmaWVsZHMuZXhjbHVkZVZhbHVlcyA9IHZhbHVlLmV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgY29uc3QgbWluID0gZmluaXRlTnVtYmVyKHZhbHVlLm1pbik7XG4gICAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKHZhbHVlLm1heCk7XG5cbiAgICBpZiAobWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkcy5taW4gPSBtaW47XG4gICAgfVxuICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRzLm1heCA9IG1heDtcbiAgICB9XG4gIH1cblxuICAvLyBBbiBhdXRob3JlZCBkZWZhdWx0IHRoYXQgbGVhdmVzIHNlbGVjdCB2YWx1ZXMgb3V0LCBvciBhIG51bWJlciByYW5nZSdzXG4gIC8vIGVuZHMgKDAga2VwdCksIGFzIGEgc2Vzc2lvbiB2YWx1ZTsgbnVsbCB3aGVuIGl0IGhvbGRzIG5laXRoZXIuXG4gIHByaXZhdGUgX2V4Y2x1ZGVPclJhbmdlRGVmYXVsdChncm91cERlZmF1bHQ6IEZpbHRlckdyb3VwRGVmYXVsdCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBpZiAoZ3JvdXBEZWZhdWx0LmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgZXhjbHVkZVZhbHVlczogZ3JvdXBEZWZhdWx0LmV4Y2x1ZGVWYWx1ZXMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW4gPSBmaW5pdGVOdW1iZXIoZ3JvdXBEZWZhdWx0Lm1pbik7XG4gICAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKGdyb3VwRGVmYXVsdC5tYXgpO1xuXG4gICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkICYmIG1heCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uKG1pbiAhPT0gdW5kZWZpbmVkID8geyBtaW4gfSA6IHt9KSxcbiAgICAgIC4uLihtYXggIT09IHVuZGVmaW5lZCA/IHsgbWF4IH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIENvdW50cyBhIHJlc2V0IGZvciBlYWNoIGxpc3Qgd2hvc2Ugc29ydCBpcyBub3QgdGhlIG9uZSBpdCBoYWQgKGBiZWZvcmVgLFxuICAvLyB0aGUgc29ydHMgYnkgbGlzdCBiZWZvcmUgdGhlIHJlc2V0KS4gQSBzb3J0IGEgbGlzdCBsb3N0IGFuZCBvbmUgaXRcbiAgLy8gZ2FpbmVkIGJvdGggY291bnQ7IHRoZSBhdXRob3JlZCBzb3J0IGlzIG5vIGVudHJ5IGVpdGhlciBzaWRlLlxuICBwcml2YXRlIF9jb3VudFNvcnRSZXNldHMoYmVmb3JlOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KTogdm9pZCB7XG4gICAgY29uc3QgbW92ZWQgPSBbLi4ubmV3IFNldChbLi4uYmVmb3JlLmtleXMoKSwgLi4udGhpcy5fbGlzdFNvcnRzLmtleXMoKV0pXVxuICAgICAgLmZpbHRlcigoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgY29uc3Qgd2FzID0gYmVmb3JlLmdldChjb21wb25lbnRJZCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHdhcyA/ICFzYW1lU29ydCh3YXMsIG5vdykgOiBub3cgIT09IG51bGw7XG4gICAgICB9KTtcblxuICAgIGlmICghbW92ZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRzID0gbmV3IE1hcCh0aGlzLl9saXN0U29ydFJlc2V0cygpKTtcbiAgICBtb3ZlZC5mb3JFYWNoKChjb21wb25lbnRJZCkgPT4gY291bnRzLnNldChjb21wb25lbnRJZCwgKGNvdW50cy5nZXQoY29tcG9uZW50SWQpID8/IDApICsgMSkpO1xuICAgIHRoaXMuX2xpc3RTb3J0UmVzZXRzLnNldChjb3VudHMpO1xuICB9XG59XG4iXX0=
1175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUl0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEdBQ2pGLE1BQU0sV0FBVyxDQUFDO0FBb0JuQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEdBQzVGLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFDTCxjQUFjLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQ2xGLFlBQVksRUFBRSxrQkFBa0IsR0FDakMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUc3QyxrRkFBa0Y7QUFDbEYsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxXQUFXLENBQ3pCLENBQTRCLEVBQzVCLENBQTRCO0lBRTVCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSztXQUNyQixDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHO1dBQ2YsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSztXQUNuQixDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRO1dBQ3pCLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7V0FDNUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztXQUMxQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHO1dBQ2YsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLENBQUM7QUFHRCxtRUFBbUU7QUFDbkUsU0FBUyxRQUFRLENBQUMsQ0FBd0IsRUFBRSxDQUF3QjtJQUNsRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNO1dBQ3ZDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFHRCw0RUFBNEU7QUFDNUUsMENBQTBDO0FBQzFDLFNBQVMsUUFBUSxDQUFDLENBQWEsRUFBRSxDQUFvQjtJQUNuRCxPQUFPLENBQUMsQ0FBQyxDQUFDO1dBQ0wsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtXQUNyQixDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFHRCw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxlQUFlLENBQzdCLENBQXNDLEVBQ3RDLENBQXNDO0lBRXRDLE9BQU8sbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUdELDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsK0VBQStFO0FBQy9FLHNFQUFzRTtBQUN0RSw2RUFBNkU7QUFDN0UsbURBQW1EO0FBQ25ELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsWUFBa0QsRUFDbEQsUUFBK0Q7SUFFL0QsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUM1QyxJQUFJLGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFHRCxzRUFBc0U7QUFDdEUsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBWTtJQUN6QyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFHRCwwRUFBMEU7QUFDMUUsU0FBUyxTQUFTLENBQUMsQ0FBb0IsRUFBRSxDQUFvQjtJQUMzRCxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFHRCwwRUFBMEU7QUFDMUUsU0FBUyxVQUFVLENBQ2pCLENBQXlDLEVBQ3pDLENBQXlDO0lBRXpDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSTtXQUNuQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFHRCw4REFBOEQ7QUFDOUQsU0FBUyxRQUFRLENBQUMsQ0FBbUIsRUFBRSxDQUFtQjtJQUN4RCxPQUFPLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7V0FDdkQsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFHRCwrRUFBK0U7QUFDL0UsaUZBQWlGO0FBQ2pGLDhFQUE4RTtBQUM5RSxxQ0FBcUM7QUFDckMsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQXdCO0lBQ3ZELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBRTNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPO1FBQ0wsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3hCLFlBQVksQ0FBQyxHQUFHLElBQUksRUFBRTtRQUN0QixZQUFZLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDeEIsWUFBWSxDQUFDLFFBQVEsSUFBSSxFQUFFO1FBQzNCLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JDLENBQUMsWUFBWSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxHQUFHLElBQUksRUFBRTtRQUN0QixZQUFZLENBQUMsR0FBRyxJQUFJLEVBQUU7S0FDdkIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBR0QsMkNBQTJDO0FBQzNDLFNBQVMsbUJBQW1CO0lBQzFCLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBR0QsNEVBQTRFO0FBQzVFLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UseUVBQXlFO0FBQ3pFLEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLHVFQUF1RTtBQUN2RSx5Q0FBeUM7QUFDekMsRUFBRTtBQUNGLG9FQUFvRTtBQUNwRSx1RUFBdUU7QUFDdkUsNEVBQTRFO0FBQzVFLHNFQUFzRTtBQUN0RSw2QkFBNkI7QUFDN0IsRUFBRTtBQUNGLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsMkVBQTJFO0FBQzNFLGtEQUFrRDtBQUVsRCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLDZFQUE2RTtJQUM3RSw0REFBNEQ7SUFDNUMsUUFBUSxHQUFHLE1BQU0sQ0FBUyxLQUFLLENBQUMsQ0FBQztJQUVqRCwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw2Q0FBNkM7SUFDN0IsYUFBYSxHQUFHLE1BQU0sQ0FBc0Isc0JBQXNCLEVBQUU7UUFDbEYsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtlQUNqQyxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRO2VBQ3pCLENBQUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLFlBQVk7S0FDdkMsQ0FBQyxDQUFDO0lBRUgsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQzVFLG9CQUFvQjtJQUNKLFVBQVUsR0FBRyxNQUFNLENBQXlDLElBQUksR0FBRyxFQUFFLEVBQUU7UUFDckYsS0FBSyxFQUFFLFVBQVU7S0FDbEIsQ0FBQyxDQUFDO0lBRUgsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSw2REFBNkQ7SUFDN0MsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUVwRSx1RUFBdUU7SUFDdkUsdUVBQXVFO0lBQ3ZFLHlFQUF5RTtJQUN6RSxTQUFTO0lBQ08sY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUV4RSxnRUFBZ0U7SUFDaEQsSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUV0RCx3RUFBd0U7SUFDeEUseURBQXlEO0lBQ3pDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFdEQsK0VBQStFO0lBQy9FLHVFQUF1RTtJQUN2RSxvREFBb0Q7SUFDcEMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXRGLHlFQUF5RTtJQUN6RSxpRUFBaUU7SUFDakQsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUV4RCxpRUFBaUU7SUFDakUsNEVBQTRFO0lBQzVFLDhEQUE4RDtJQUM5RCwyRUFBMkU7SUFDM0UsdURBQXVEO0lBQ3ZDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDLENBQUMsQ0FBQztJQUVLLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztJQUM5QyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7SUFDL0MsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU3Qyw4RUFBOEU7SUFDOUUsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUNqRSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUVyQyw4RUFBOEU7SUFDOUUsdUVBQXVFO0lBQ3ZFLDhCQUE4QjtJQUM5Qix5REFBeUQ7SUFDekQsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUN0RSxVQUFVLEdBQTRCLElBQUksQ0FBQztJQUMzQyxrQkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWpELDhFQUE4RTtJQUM5RSwrRUFBK0U7SUFDL0UsaUZBQWlGO0lBQ3pFLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUVuRCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLGtFQUFrRTtJQUMxRCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFbEQsd0VBQXdFO0lBQ3hFLHdEQUF3RDtJQUNoRCxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFFcEQsNEVBQTRFO0lBQzVFLG1FQUFtRTtJQUNuRSxpRUFBaUU7SUFDekQsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUVoQyxzREFBc0Q7SUFDOUMsbUJBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUVwRCwyRUFBMkU7SUFDM0Usa0RBQWtEO0lBQzFDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBaUIsQ0FBQztJQUVqRCxnRUFBZ0U7SUFDeEQsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFN0Msd0VBQXdFO0lBQ3hFLHdFQUF3RTtJQUN4RSx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLHVFQUF1RTtJQUN2RSxjQUFjO0lBQ2QsbUVBQW1FO0lBQ25FLHdFQUF3RTtJQUN4RSxTQUFTO0lBQ0QsU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNwRixZQUFZLEVBQUUsQ0FBQztRQUNmLGFBQWEsRUFBRSxJQUFJO0tBQ3BCLENBQUMsQ0FBQztJQUVLLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUIsZUFBZSxHQUFHLE1BQU0sQ0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXpFLHdFQUF3RTtJQUN4RSxXQUFXO0lBQ0gsT0FBTyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFOUMsb0VBQW9FO0lBQzVELE9BQU8sR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRTlDLHdEQUF3RDtJQUNoRCxNQUFNLEdBQUcsTUFBTSxDQUFvQixLQUFLLENBQUMsQ0FBQztJQUVsRCwwRUFBMEU7SUFDMUUsMENBQTBDO0lBQ2xDLE9BQU8sR0FBRyxNQUFNLENBQWtELElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVyRixzREFBc0Q7SUFDOUMsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFL0Msd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsaURBQWlEO0lBQ3pDLFlBQVksR0FBRyxNQUFNLENBQStDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUV2RiwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQ3RFLHVFQUF1RTtJQUN2RSwwQ0FBMEM7SUFDbEMsZUFBZSxHQUFHLE1BQU0sQ0FBcUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRWhGLHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLFlBQVk7SUFDSixtQkFBbUIsR0FBRyxNQUFNLENBQXlDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUV4Rix1RUFBdUU7SUFDdkUseUNBQXlDO0lBQ2pDLFVBQVUsR0FBRyxNQUFNLENBQXVCLG1CQUFtQixFQUFFLENBQUMsQ0FBQztJQUV6RSw0RUFBNEU7SUFDNUUsc0VBQXNFO0lBQ3RFLHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsa0RBQWtEO0lBQ2xELEVBQUU7SUFDRiw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUNqRSxJQUFJLENBQUMsTUFBYztRQUN4QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV6Qyw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3JELCtDQUErQztRQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDO1FBRTVELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFFcEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBZTtRQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQy9ELFFBQVEsQ0FBQyxPQUFlLEVBQUUsS0FBOEI7UUFDN0QsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSwyQkFBMkI7SUFDcEIsZUFBZSxDQUFDLElBQVk7UUFDakMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCx3RUFBd0U7SUFDakUsU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSxnQ0FBZ0M7SUFDekIsWUFBWSxDQUFDLFNBQWtDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLGlEQUFpRDtJQUMxQyxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxtREFBbUQ7SUFDNUMsUUFBUSxDQUFDLFdBQW1CO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2xELENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsd0VBQXdFO0lBQ3hFLHNFQUFzRTtJQUN0RSwyRUFBMkU7SUFDM0Usc0VBQXNFO0lBQ3RFLHlFQUF5RTtJQUN6RSx3RUFBd0U7SUFDeEUsd0RBQXdEO0lBQ2pELFdBQVcsQ0FBQyxTQUEwQixFQUFFLElBQXVCO1FBQ3BFLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsd0VBQXdFO0lBQ2pFLFVBQVUsQ0FBQyxXQUFtQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNyRCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDJEQUEyRDtJQUMzRCw2RUFBNkU7SUFDN0UsOERBQThEO0lBQ3ZELGNBQWMsQ0FBQyxTQUEwQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxlQUFlO2VBQ3RCLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTTtlQUN6QixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVyRCxPQUFPLE1BQU0sQ0FBQyxPQUFPO3VCQUNoQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt1QkFDckMsS0FBSyxFQUFFLElBQUksS0FBSyxTQUFTO3VCQUN6QixDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUM7WUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLHdFQUF3RTtJQUN4RSwrRUFBK0U7SUFDeEUsYUFBYSxDQUFDLFdBQW1CLEVBQUUsSUFBWTtRQUNwRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEMsSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzNELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxhQUFhLENBQUMsV0FBbUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSx1RUFBdUU7SUFDaEUsZ0JBQWdCLENBQUMsV0FBbUIsRUFBRSxLQUF3QjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFOUUsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFeEMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCx5RUFBeUU7SUFDbEUsaUJBQWlCLENBQUMsV0FBbUI7UUFDMUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFO2FBQzNDLElBQUksQ0FDSCxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsRUFDcEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUNyQixDQUFDO0lBQ04sQ0FBQztJQUVELHVFQUF1RTtJQUN2RSx1RUFBdUU7SUFDdkUsbURBQW1EO0lBQzVDLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFFBQWdCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBZTtRQUNuRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQseUVBQXlFO1FBQ3pFLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLFNBQVM7SUFDRixVQUFVLENBQUMsU0FBZ0M7UUFDaEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTthQUNqQyxJQUFJLENBQ0gsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSTtlQUNqQyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FDckYsQ0FBQztJQUNOLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHNFQUFzRTtJQUN0RSwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLHdFQUF3RTtJQUN4RSx1QkFBdUI7SUFDaEIsYUFBYSxDQUFDLFVBQW1DO1FBQ3RELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUU7YUFDakMsSUFBSSxDQUNILFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBcUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxJQUFJO2VBQ3BELFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztpQkFDMUQsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDMUQsQ0FBQztJQUNOLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLG9CQUFvQjtJQUNiLG1CQUFtQixDQUFDLFNBQTBCO1FBQ25ELE1BQU0sUUFBUSxHQUEwQixFQUFFLENBQUM7UUFFM0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxTQUFTLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzVELFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRTFELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLDJFQUEyRTtJQUMzRSx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLDJCQUEyQjtJQUNwQixhQUFhO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDL0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUzQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hELENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUMsRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0Usd0VBQXdFO0lBQ3hFLHFFQUFxRTtJQUM5RCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsU0FBd0IsSUFBSTtRQUNsRSxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2FBQy9CLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUVuRCxPQUFPLEtBQUs7YUFDVCxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7YUFDdkMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDeEMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxPQUFPLENBQUMsTUFBcUI7UUFDbEMsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDOUIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsNkJBQTZCO0lBQ3RCLFFBQVEsQ0FBQyxLQUF3QjtRQUN0QyxNQUFNLElBQUksR0FBc0IsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDaEUsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUseUVBQXlFO0lBQ2xFLEtBQUssQ0FBQyxXQUFtQjtRQUM5QixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSw2QkFBNkI7SUFDdEIsUUFBUSxDQUFDLFdBQW1CLEVBQUUsSUFBZ0M7UUFDbkUsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEYsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCwwRUFBMEU7SUFDbkUsWUFBWSxDQUFDLFdBQW1CO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7YUFDdEMsSUFBSSxDQUNILFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUNwQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQ3JCLENBQUM7SUFDTixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsd0RBQXdEO0lBQ2pELFVBQVUsQ0FBQyxXQUFtQixFQUFFLElBQWdDO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFM0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSwrREFBK0Q7SUFDeEQsVUFBVSxDQUFDLFNBQTBCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCwyRUFBMkU7SUFDM0Usc0VBQXNFO0lBQ3RFLGlDQUFpQztJQUMxQixpQkFBaUIsQ0FBQyxTQUEwQjtRQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0RCxPQUFPLE9BQU8sRUFBRSxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLHVEQUF1RDtJQUNoRCxhQUFhLENBQUMsU0FBMEIsRUFBRSxNQUFrQjtRQUNqRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSx5QkFBeUI7SUFDbEIsaUJBQWlCLENBQUMsU0FBMEI7UUFDakQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDRCQUE0QjtJQUNyQixhQUFhLENBQUMsU0FBMEI7UUFDN0MsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDhDQUE4QztJQUN2QyxnQkFBZ0IsQ0FBQyxTQUEwQixFQUFFLFNBQW9DO1FBQ3RGLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEcsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLGlFQUFpRTtJQUMxRCxRQUFRO1FBQ2IsTUFBTSxRQUFRLEdBQXdCLEVBQUUsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzVCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLGtFQUFrRTtJQUMzRCxjQUFjO1FBQ25CLE1BQU0sTUFBTSxHQUE4QyxFQUFFLENBQUM7UUFFN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSwwRUFBMEU7SUFDMUUsZ0VBQWdFO0lBQ3pELGVBQWU7UUFDcEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsbUVBQW1FO0lBQ25FLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsZUFBZTtJQUNSLHFCQUFxQixDQUFDLFFBQTJCO1FBQ3RELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSx3RUFBd0U7SUFDeEUseUVBQXlFO0lBQ3pFLGlCQUFpQjtJQUNWLHdCQUF3QixDQUFDLFFBQTJCO1FBQ3pELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVqQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0UsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBRTdHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLG9EQUFvRDtJQUM3QyxTQUFTLENBQUMsU0FBMEI7UUFDekMsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSw0Q0FBNEM7SUFDckMsVUFBVSxDQUFDLE9BQWU7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNoRCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLHNFQUFzRTtJQUN0RSx5RUFBeUU7SUFDekUsZ0VBQWdFO0lBQ2hFLGtFQUFrRTtJQUNsRSwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLGtCQUFrQjtJQUNWLGVBQWUsQ0FBQyxLQUF1QjtRQUM3QyxNQUFNLE1BQU0sR0FBMEMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLE1BQU0sQ0FBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN4QixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUMsT0FBTyxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSztlQUM3RCxNQUFNLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUztZQUMvRSxDQUFDLENBQUMsTUFBTTtZQUNSLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ2hFLFdBQVcsQ0FBQyxLQUF1QjtRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoRCxPQUFPLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSw0Q0FBNEM7SUFDcEMsS0FBSyxDQUNYLEtBQXdCLEVBQ3hCLFFBQWtDLEVBQ2xDLGVBQXdCO1FBRXhCLE1BQU0sY0FBYyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUV0RyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxNQUFNLGVBQWUsR0FBRyxlQUFlO2VBQ2xDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTTtlQUNmLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDO1FBRXRELElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9DLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUMxQixnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUNqRSxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUU7WUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSw2Q0FBNkM7SUFDckMsTUFBTSxDQUFDLE1BQWM7UUFDM0IsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRTtZQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUUvQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsd0VBQXdFO1FBQ3hFLGdFQUFnRTtRQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7YUFDL0MsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO1FBRXBELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRTVFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLHdDQUF3QztJQUNoQyxXQUFXLENBQUMsTUFBb0MsRUFBRSxLQUF1QjtRQUMvRSxNQUFNLEtBQUssR0FBcUIsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzdDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUVwQixPQUFPLE1BQU0sRUFBRSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7WUFDOUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDckMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBYztRQUNwQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sQ0FBQzthQUM1QixNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSw2RUFBNkU7SUFDckUsZ0JBQWdCLENBQUMsU0FBMEI7UUFDakQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUVoQyxJQUFJLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDNUIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0QsQ0FBQztRQUVELE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsNEVBQTRFO0lBQzVFLHVFQUF1RTtJQUN2RSx1REFBdUQ7SUFDL0MsYUFBYSxDQUFDLEtBQXdCO1FBQzVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV6RCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUYsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0MsT0FBTztnQkFDTCxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUNqQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsSUFBSSxJQUFJO2FBQzlCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLDBFQUEwRTtJQUNsRSxjQUFjLENBQUMsUUFBZ0I7UUFDckMsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsMEVBQTBFO1lBQzFFLG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLDREQUE0RDtZQUM1RCxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEYsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUVsQyxPQUFPO29CQUNMLEtBQUssRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLENBQUM7b0JBQ3JFLEdBQUcsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLENBQUM7aUJBQ2xFLENBQUM7WUFDSixDQUFDO1lBQ0QsS0FBSyxXQUFXO2dCQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDOUMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDL0MsS0FBSyxhQUFhO2dCQUNoQixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2hELEtBQUssYUFBYTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDakQsS0FBSyxXQUFXO2dCQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNsRCxLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQy9DO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLCtCQUErQjtJQUN2QixlQUFlO1FBQ3JCLE1BQU0sTUFBTSxHQUE4QyxFQUFFLENBQUM7UUFFN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDL0QsY0FBYztRQUNwQixNQUFNLEtBQUssR0FBb0MsRUFBRSxDQUFDO1FBRWxELEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQW9CLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXZDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHdDQUF3QztJQUNoQyxhQUFhLENBQUMsS0FBd0I7UUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFL0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCx5Q0FBeUM7SUFDakMsV0FBVztRQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELDBFQUEwRTtJQUNsRSxjQUFjLENBQUMsU0FBMEIsRUFBRSxNQUFrQjtRQUNuRSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxTQUFTLEdBQUcsR0FBRyxLQUFLLElBQUk7WUFDNUIsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUNWLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUVwRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLHdCQUF3QjtJQUNoQixpQkFBaUI7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM1RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sRUFBRSxXQUFXLENBQUM7WUFDNUQsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM3QixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMxRixNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakcsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELDREQUE0RDtJQUNwRCxhQUFhLENBQUMsV0FBbUIsRUFBRSxJQUFnQztRQUN6RSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVyQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0Usb0RBQW9EO0lBQzVDLFlBQVksQ0FBQyxTQUFrQztRQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFCLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELDRDQUE0QztJQUNwQyxNQUFNO1FBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTlCLE9BQU8sTUFBTTtZQUNYLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBRU8sUUFBUSxDQUFDLFdBQW1CO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRTthQUNqQixJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSx3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDbEUsaUJBQWlCO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7YUFDaEMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQzthQUNoRCxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7UUFFeEQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRTtZQUNuRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRWxILElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDekQsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUNqRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDMUUsb0VBQW9FO0lBQzVELGVBQWUsQ0FBQyxNQUFjO1FBQ3BDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHdFQUF3RTtJQUNoRSx1QkFBdUIsQ0FBQyxLQUF1QixFQUFFLE1BQTZDO1FBQ3BHLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEQsTUFBTSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzdDLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFcEMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLGlFQUFpRTtJQUN6RCxzQkFBc0IsQ0FBQyxZQUFnQztRQUM3RCxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkQsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzQyxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU87WUFDTCxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UscUVBQXFFO0lBQ3JFLGdFQUFnRTtJQUN4RCxnQkFBZ0IsQ0FBQyxNQUF1QztRQUM5RCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3RFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDO1lBRXJELE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQzt3R0FwdUNVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IEdyaWRDbGVhcmVkRmlsdGVyLCBHcmlkRXhwYW5zaW9uLCBHcmlkTGF5b3V0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgc2NhbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgZW5kT2ZXZWVrLCBzdGFydE9mTW9udGgsIHN0YXJ0T2ZRdWFydGVyLCBzdGFydE9mV2Vlaywgc3RhcnRPZlllYXIsXG4gIHN1YkRheXMsIHN1Yk1vbnRocywgc3ViV2Vla3MsXG59IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0gZnJvbSAnLi4vY29uc3RzL3JlcG9ydC13ZWVrLmNvbnN0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIGdldFpvbmVkTm93LCByZXNvbHZlRm9ybWF0Q29udGV4dCwgcmVzb2x2ZVJlcG9ydFRpbWV6b25lLFxufSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHsgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXQtdmlld2VyLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RHJpbGxTdGVwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZHJpbGwtc3RlcC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyTWF0Y2ggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkU2Vzc2lvbkxheW91dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWdyaWQtc2Vzc2lvbi1sYXlvdXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFRlbXBvcmFyeVN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdGVtcG9yYXJ5LXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRUaWxlU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC10aWxlLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRTdGF0ZVNuYXBzaG90IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtc3RhdGUtc25hcHNob3QuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRSZWxhdGl2ZVJhbmdlLFxuICBSZXBvcnRTb3J0LFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgbGlzdEhpZGRlbkNvbHVtbnMsIGxpc3RTb3J0VGVybXMgfSBmcm9tICcuLi9saXN0LWNvbmZpZyc7XG5pbXBvcnQgeyBkYXRlQm91bmRTdHJpbmcsIExJU1RfU0VBUkNIX01BWF9MRU5HVEggfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGdyb3VwVmFsdWVTaWduYXR1cmUgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7XG4gIEdSSURfR1JBTlVMQVJJVElFUywgYXV0aG9yZWRHcmlkTGF5b3V0LCBncmFpbmVkR3JpZExheW91dCwgZ3JpZExheW91dEtleSwgcmViYXNlZEdyaWRMYXlvdXQsXG59IGZyb20gJy4uL3JlcG9ydC1ncmlkLWxheW91dCc7XG5pbXBvcnQgeyBpc1RpbGUgfSBmcm9tICcuLi9yZXBvcnQtdGlsZSc7XG5pbXBvcnQge1xuICBjbGVhbkRyaWxsUGF0aCwgZmluaXRlTnVtYmVyLCBpc1JlbGF0aXZlUmFuZ2UsIHNhbWVEcmlsbFBhdGgsIHNhbWVTdG9yZWRHcm91cFZhbHVlLFxuICBzdGF0ZURpZmZlcnMsIHRvU3RvcmVkR3JvdXBWYWx1ZSxcbn0gZnJvbSAnLi4vcmVwb3J0LXN0YXRlJztcbmltcG9ydCB7IENvbXBvbmVudERhdGFTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyB0aWxlRGF0YVN0YXRlIH0gZnJvbSAnLi4vdGlsZS1kYXRhLXN0YXRlJztcbmltcG9ydCB7IHJlcG9ydENvbXBvbmVudHMgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgc2FtZUxpc3QoYS52YWx1ZXMsIGIudmFsdWVzKVxuICAgICYmIHNhbWVMaXN0KGEuZXhjbHVkZVZhbHVlcywgYi5leGNsdWRlVmFsdWVzKVxuICAgICYmIGEubWluID09PSBiLm1pblxuICAgICYmIGEubWF4ID09PSBiLm1heDtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBzdG9yZWQgbGlzdHMgaG9sZCB0aGUgc2FtZSB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIuXG5mdW5jdGlvbiBzYW1lTGlzdChhOiB1bmtub3duW10gfCB1bmRlZmluZWQsIGI6IHVua25vd25bXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGEgPz8gW10pLmxlbmd0aCA9PT0gKGIgPz8gW10pLmxlbmd0aFxuICAgICYmIChhID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIgPz8gW10pW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdCBzb3J0cyBvcmRlciB0aGUgcm93cyB0aGUgc2FtZSB3YXkuIE5vIGRpcmVjdGlvbiByZWFkcyBhc1xuLy8gYXNjZW5kaW5nLCB0aGUgd2F5IHRoZSBsaXN0IGFwcGxpZXMgaXQuXG5mdW5jdGlvbiBzYW1lU29ydChhOiBSZXBvcnRTb3J0LCBiOiBSZXBvcnRTb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFiXG4gICAgJiYgYS5jb2x1bW4gPT09IGIuY29sdW1uXG4gICAgJiYgKGEuZGlyZWN0aW9uID8/ICdhc2MnKSA9PT0gKGIuZGlyZWN0aW9uID8/ICdhc2MnKTtcbn1cblxuXG4vLyBXaGV0aGVyIGEgdmFsdWUgcmVhZCBvZmYgYSBmaWx0ZXIgYmFyIGlzIHRoZSB2YWx1ZSBhbHJlYWR5IHN0b3JlZCBmb3IgaXRzXG4vLyBncm91cDogdGhlIHNhbWUgY2FsZW5kYXIgZGF5cywgdGhlIHNhbWUgc2VsZWN0IHZhbHVlcyBrZXB0IG9yIGxlZnQgb3V0IGluXG4vLyB0aGUgc2FtZSBvcmRlciwgdGhlIHNhbWUgdHJpbW1lZCB0ZXh0IGFuZCB0aGUgc2FtZSBudW1iZXIgcmFuZ2UgZW5kcy4gQVxuLy8gYmFyIHJlLXJlYWRzIGV2ZXJ5IGdyb3VwIGl0IHNob3dzIG9uIGFueSBjaGFuZ2UsIHNvIHRoaXMgaXMgd2hhdCB0ZWxscyB0aGVcbi8vIGdyb3VwIHRoYXQgY2hhbmdlZCBmcm9tIHRoZSBvbmVzIHRoYXQgZGlkIG5vdC5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRmlsdGVyVmFsdWUoXG4gIGE6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZ3JvdXBWYWx1ZVNpZ25hdHVyZShhKSA9PT0gZ3JvdXBWYWx1ZVNpZ25hdHVyZShiKTtcbn1cblxuXG4vLyBUaGUgZ3JvdXBzIGEgYmFyIHJlLXJlYWQgdGhhdCBpdCBub3cgc2hvd3Mgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIG9uZVxuLy8gaXQgbGFzdCByZXBvcnRlZCwgcmVjb3JkaW5nIGVhY2ggbmV3IHZhbHVlIGluIGBsYXN0UmVwb3J0ZWRgLiBBIGJhciBpc1xuLy8gY29tcGFyZWQgd2l0aCBpdHNlbGYsIG5ldmVyIHdpdGggdGhlIHN0b3JlZCB2YWx1ZTogYSBncm91cCBzaG93biBpbiB0d28gYmFyc1xuLy8gKGxldmVsICdib3RoJykgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIG90aGVyIG9uZSwgYW5kIHRoaXMgYmFyIGlzIG5vdFxuLy8gcmVwYWludGVkLCBzbyBpdHMgc3RhbGUgdmFsdWUgbXVzdCBub3QgYmUgc2V0IGJhY2sgd2hlbiB0aGUgdmlld2VyIGNoYW5nZXNcbi8vIGFub3RoZXIgb2YgaXRzIGl0ZW1zICh0aGUgbGlzdCBzZWFyY2ggYm94LCBzYXkpLlxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVkR3JvdXBWYWx1ZXMoXG4gIGxhc3RSZXBvcnRlZDogTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGw+LFxuICByZXBvcnRlZDogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiByZXBvcnRlZC5maWx0ZXIoKHsgZ3JvdXBJZCwgdmFsdWUgfSkgPT4ge1xuICAgIGlmIChzYW1lRmlsdGVyVmFsdWUobGFzdFJlcG9ydGVkLmdldChncm91cElkKSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGFzdFJlcG9ydGVkLnNldChncm91cElkLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cblxuLy8gQSBsaXN0J3Mgc2VhcmNoIHRleHQgYXMgdGhlIHNlcnZlciBhcHBsaWVzIGl0OiB0cmltbWVkLCB0aGVuIGN1dCB0b1xuLy8gTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cywgYXMgdGhlIHNlcnZlciBjb3VudHMgdGhlbSkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi50ZXh0LnRyaW0oKV0uc2xpY2UoMCwgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCkuam9pbignJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdHMgb2YgY29sdW1uIG5hbWVzIGFyZSB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVOYW1lcyhhOiByZWFkb25seSBzdHJpbmdbXSwgYjogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChuYW1lLCBpbmRleCkgPT4gbmFtZSA9PT0gYltpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGhpZGRlbi1jb2x1bW4gbWFwcyBoaWRlIHRoZSBzYW1lIGNvbHVtbnMgb24gdGhlIHNhbWUgbGlzdHMuXG5mdW5jdGlvbiBzYW1lSGlkZGVuKFxuICBhOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbiAgYjogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuc2l6ZSA9PT0gYi5zaXplXG4gICAgJiYgWy4uLmFdLmV2ZXJ5KChbY29tcG9uZW50SWQsIG5hbWVzXSkgPT4gc2FtZU5hbWVzKG5hbWVzLCBiLmdldChjb21wb25lbnRJZCkgPz8gW10pKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBkYXRlLXJhbmdlIHZhbHVlcyBjb3ZlciB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLlxuZnVuY3Rpb24gc2FtZURheXMoYTogRmlsdGVyR3JvdXBWYWx1ZSwgYjogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGF0ZUJvdW5kU3RyaW5nKGEuc3RhcnQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5zdGFydClcbiAgICAmJiBkYXRlQm91bmRTdHJpbmcoYS5lbmQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5lbmQpO1xufVxuXG5cbi8vIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LiBUaGUgcmVwb3J0IHRvb2xiYXIga2V5cyBpdHNcbi8vIGZzLWZpbHRlciBvbiB0aGlzLCBiZWNhdXNlIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCDigJQgd2l0aG91dCBhXG4vLyBrZXkgY2hhbmdlIGl0IGtlZXBzIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggZXZlbiBhZnRlciB0aGVcbi8vIGNvbmZpZyBiZWhpbmQgaXQgaGFzIGJlZW4gcmVidWlsdC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2lnbmF0dXJlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHN0cmluZyB7XG4gIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcblxuICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5lbmQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnZhbHVlID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSA/PyAnJyxcbiAgICAoZ3JvdXBEZWZhdWx0LnZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICAgIChncm91cERlZmF1bHQuZXhjbHVkZVZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICAgIGdyb3VwRGVmYXVsdC5taW4gPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0Lm1heCA/PyAnJyxcbiAgXS5qb2luKCd+Jyk7XG59XG5cblxuLy8gVGhlIHRlbXBvcmFyeSBsYXllciB3aXRoIG5vdGhpbmcgcGlja2VkLlxuZnVuY3Rpb24gZW1wdHlUZW1wb3JhcnlTdGF0ZSgpOiBSZXBvcnRUZW1wb3JhcnlTdGF0ZSB7XG4gIHJldHVybiB7IGNyb3NzRmlsdGVyczogW10sIHNob3dSb3dzOiBudWxsIH07XG59XG5cblxuLy8gVmlld2VyIGZpbHRlciBzdGF0ZSBmb3IgdGhlIG9wZW4gcmVwb3J0LiBGaWx0ZXIgVkFMVUVTIGFyZSBuZXZlciBzYXZlZCB0b1xuLy8gdGhlIHJlcG9ydCDigJQgdGhpcyBzZXJ2aWNlIGhvbGRzIHRoZW0gcGVyIGZpbHRlciBHUk9VUCAodGhlIHByb3BhZ2F0aW9uIHVuaXQpLFxuLy8gcmVzb2x2ZXMgdGhlbSBpbnRvIHBlci1jb21wb25lbnQgbWVtYmVyLWZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggZGF0YSByZXF1ZXN0LFxuLy8gYW5kIG5vdGlmaWVzIHRoZSBjb21wb25lbnRzIHdob3NlIGdyb3VwcyBjaGFuZ2VkIHNvIG9ubHkgdGhleSByZWZldGNoLlxuLy9cbi8vIEl0IGlzIHRoZSBvbmUgcGxhY2UgdGhlIHZpZXdlcidzIHN0YXRlIGxpdmVzIHdoaWxlIHRoZSByZXBvcnQgaXMgb3BlbjogdGhlXG4vLyBncm91cCB2YWx1ZXMsIHRoZSBncm91cC1ieSBncmFpbiwgdGhlIG1hdGNoLCBsaXN0IHNvcnRzLCBzZWFyY2hlcyBhbmQgaGlkZGVuXG4vLyBjb2x1bW5zLCB0aGUgcGFnZSwgZWFjaCBjaGFydCdzIGRyaWxsIHBhdGggYW5kIGVhY2ggdGFibGUncyBsYXlvdXQuIE5vbmUgb2Zcbi8vIGl0IGlzIGV2ZXIgd3JpdHRlbiB0byB0aGUgYnJvd3NlciBVUkwuIEl0IG91dGxpdmVzIGEgcGFnZSBzd2l0Y2ggKHRoZSBjYW52YXNcbi8vIGNoYW5nZXMgdGhlIHBhZ2UsIG5vdCB0aGlzIHNlcnZpY2UpIGFuZCBnb2VzIHdpdGggdGhlIHJlcG9ydCB2aWV3OiBhIHJlbG9hZFxuLy8gc3RhcnRzIGEgbmV3IHNlcnZpY2UsIHdoaWNoIG9wZW5zIG9uIHRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0cy5cbi8vIGNoYW5nZXMoKSBmaXJlcyBvbiBldmVyeSBjaGFuZ2Ugb2YgaXQuXG4vL1xuLy8gVGhlIGR1cmFibGUgcGFydCByZWFkcyBhcyBvbmUgZG9jdW1lbnQ6IHNuYXBzaG90KCkgd3JpdGVzIGl0LCBhbmRcbi8vIGRpZmZlcnNGcm9tRGVmYXVsdHMgc2F5cyB3aGV0aGVyIHRoZSBzY3JlZW4gc3RpbGwgc2hvd3MgdGhlIHJlcG9ydCdzXG4vLyBhdXRob3JlZCBkZWZhdWx0cyAocmVzZXRUb0RlZmF1bHRzKCkgcHV0cyBpdCBiYWNrIG9uIHRoZW0pLiBUaGUgdGVtcG9yYXJ5XG4vLyBsYXllciAoYSBjcm9zcy1maWx0ZXIsIGFuIG9wZW4gcm93cyBwYW5lbCkgaXMgaXRzIG93biBzZWN0aW9uLCBzbyBhXG4vLyBzbmFwc2hvdCBuZXZlciBjYXJyaWVzIGl0LlxuLy9cbi8vIFNlc3Npb24tb25seSwgbmV2ZXIgaW4gdGhlIHNuYXBzaG90OiBwZXItZmlsdGVyIGVuYWJsZS9kaXNhYmxlIHRvZ2dsZXMgZnJvbVxuLy8gYSBjb21wb25lbnQncyBmaWx0ZXIgbWVudSAodGhlIGBlbmFibGVkYCBjb2x1bW4gaXMgdGhlIGF1dGhvcmVkIGRlZmF1bHQ7IGFcbi8vIHZpZXdlcidzIHRvZ2dsZSBzaG91bGRuJ3Qgd3JpdGUgdG8gdGhlIHJlcG9ydCksIGFuZCBlYWNoIHRhYmxlJ3MgbGF5b3V0LFxuLy8gd2hpY2ggZnMtZ3JpZCBzZW5kcyB3aXRoIHRoZSB0YWJsZSdzIG93biByZWFkcy5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uge1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUpLiBSZWxhdGl2ZSBwcmVzZXRzXG4gIC8vIHJlc29sdmUgYWdhaW5zdCB0b2RheSBpbiBpdCwgYW5kIGRhdGUgY2VsbHMgcmVuZGVyIGluIGl0LlxuICBwdWJsaWMgcmVhZG9ubHkgdGltZXpvbmUgPSBzaWduYWw8c3RyaW5nPignVVRDJyk7XG5cbiAgLy8gSG93IHRoZSBvcGVuIHJlcG9ydCB3cml0ZXMgaXRzIG51bWJlcnMgYW5kIGRhdGVzIChyZXNvbHZlRm9ybWF0Q29udGV4dCk6XG4gIC8vIGl0cyBsb2NhbGUsIGl0cyBjdXJyZW5jeSBhbmQgd2hldGhlciBwZXJjZW50cyBhcnJpdmUgYXMgcmF0aW9zLiBFdmVyeSBLUEksXG4gIC8vIGNoYXJ0LCBkYXRlIGNlbGwgYW5kIGV4cG9ydCByZWFkcyBpdCBoZXJlLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWRcbiAgLy8gb2YgYW4gdW5jaGFuZ2VkIHJlcG9ydCByZS1yZW5kZXJzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gc2lnbmFsPFJlcG9ydEZvcm1hdENvbnRleHQ+KERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIHtcbiAgICBlcXVhbDogKGEsIGIpID0+IGEubG9jYWxlID09PSBiLmxvY2FsZVxuICAgICAgJiYgYS5jdXJyZW5jeSA9PT0gYi5jdXJyZW5jeVxuICAgICAgJiYgYS5yYXRpb1BlcmNlbnQgPT09IGIucmF0aW9QZXJjZW50LFxuICB9KTtcblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGVhY2ggcGxhaW4gbGlzdCAobGlzdEhpZGRlbkNvbHVtbnMpLFxuICAvLyBieSBjb21wb25lbnQgaWQ7IGEgbGlzdCBzaG93aW5nIGV2ZXJ5IGNvbHVtbiBoYXMgbm8gZW50cnkuIEEgc2lnbmFsLCBzbyBhXG4gIC8vIGxpc3QgaGlkZXMgYW5kIHNob3dzIGl0cyBjb2x1bW5zIGluIHBsYWNlOiB0aGUgcm93cyBkbyBub3QgY2hhbmdlLCBzb1xuICAvLyBub3RoaW5nIHJlZmV0Y2hlcy4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkIHRoYXQga2VlcHMgZXZlcnkgY29sdW1uXG4gIC8vIHJlcGFpbnRzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0SGlkZGVuID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+PihuZXcgTWFwKCksIHtcbiAgICBlcXVhbDogc2FtZUhpZGRlbixcbiAgfSk7XG5cbiAgLy8gTW92ZXMgZWFjaCB0aW1lIHJlc2V0VG9EZWZhdWx0cygpIHJlcGxhY2VzIHRoZSB3aG9sZSBkdXJhYmxlIHN0YXRlLiBCYXJzXG4gIC8vIGFuZCB0aWxlcyBrZXkgb24gaXQsIHNvIGEgcmVzZXQgcmVwYWludHMgYWxsIG9mIHRoZW07IHRoZSB0aWxlcyByZWZldGNoXG4gIC8vIGluIHBsYWNlLCBzbyB0aGVpciBkYXRhIHN0YXlzIG9uIHNjcmVlbiB3aGlsZSB0aGV5IHJlbG9hZC5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3N0YXRlVmVyc2lvbigpKTtcblxuICAvLyBCeSBsaXN0IGNvbXBvbmVudCBpZCwgaG93IG1hbnkgcmVzZXRzIG1vdmVkIHRoYXQgbGlzdCdzIHNvcnQuIEZzTGlzdFxuICAvLyByZWFkcyBpdHMgc29ydCBvbmx5IHdoZW4gaXQgaXMgY3JlYXRlZCwgc28gYSBsaXN0IHdob3NlIHNvcnQgYSByZXNldFxuICAvLyBtb3ZlZCBpcyBkcmF3biBhZ2FpbiAoa2V5ZWQgb24gaXRzIGNvdW50KTsgZXZlcnkgb3RoZXIgdGlsZSByZWxvYWRzIGluXG4gIC8vIHBsYWNlLlxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdFNvcnRSZXNldHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9saXN0U29ydFJlc2V0cygpKTtcblxuICAvLyBUaGUgb3BlbiBwYWdlLCBvciBudWxsIGJlZm9yZSB0aGUgaG9zdCByZXBvcnRzIG9uZSAoc2V0UGFnZSkuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcGFnZUlkKCkpO1xuXG4gIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmU6ICdhbGwnIGtlZXBzIHRoZSByb3dzIGV2ZXJ5IGdyb3VwIGtlZXBzLCAnYW55J1xuICAvLyB0aGUgcm93cyBhdCBsZWFzdCBvbmUgZWxpZ2libGUgZ3JvdXAga2VlcHMgKHNldE1hdGNoKS5cbiAgcHVibGljIHJlYWRvbmx5IG1hdGNoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fbWF0Y2goKSk7XG5cbiAgLy8gVGhlIHZpZXdlciBmZWF0dXJlcyB0aGUgb3BlbiByZXBvcnQncyBzZXJ2ZXIgc2VydmVzIChSZXBvcnQudmlld2VyRmVhdHVyZXMpOlxuICAvLyBhIGZpbHRlciBiYXIgb2ZmZXJzIGEgY29udHJvbCBvbmx5IHdoZW4gaXRzIGZlYXR1cmUgaXMgbGlzdGVkLiBFbXB0eVxuICAvLyBiZWZvcmUgYSByZXBvcnQgaXMgb3BlbiBhbmQgZnJvbSBhbiBvbGRlciBzZXJ2ZXIuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3ZXJGZWF0dXJlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3JlcG9ydCgpPy52aWV3ZXJGZWF0dXJlcyA/PyBbXSk7XG5cbiAgLy8gVGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgb3Blbi4gQSB0aWxlIGhlYWRlclxuICAvLyBsaXN0cyBpdHMgc2VsZWN0IG9wdGlvbnMgZnJvbSBpdCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcmVwb3J0KCkpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzXG4gIC8vIChzdGF0ZURpZmZlcnMpOiB3aGF0IHRoZSByZXBvcnQgYmFyJ3MgJ0NsZWFyIGZpbHRlcnMnIHNob3dzIGZvci4gQSBzd2l0Y2hcbiAgLy8gb2YgcGFnZSBkb2VzIG5vdCBjb3VudCwgYW5kIHRoZSB0ZW1wb3Jhcnkgc3RhdGUgbmV2ZXIgZG9lcy5cbiAgLy8gQSB0YWJsZSB0aWxlIGluIGEgbGF5b3V0IG9mIHRoZSB2aWV3ZXIncyBvd24gY291bnRzIHRvbzsgaXQgc3RheXMgb3V0IG9mXG4gIC8vIHRoZSBzbmFwc2hvdCwgc28gbm8gc2F2ZWQgZmlsdGVyIG9yIGxpbmsgY2FycmllcyBpdC5cbiAgcHVibGljIHJlYWRvbmx5IGRpZmZlcnNGcm9tRGVmYXVsdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5fcmV2aXNpb24oKTtcblxuICAgIHJldHVybiB0aGlzLl9ncmlkTGF5b3V0cygpLnNpemUgPiAwIHx8IHN0YXRlRGlmZmVycyh0aGlzLmF1dGhvcmVkQ29uZmlnKCksIHRoaXMuc25hcHNob3QoKSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgX3ZhbHVlcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPigpO1xuICBwcml2YXRlIF9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHByaXZhdGUgX3Nlc3Npb25EaXNhYmxlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIEdyb3VwcyB0aGF0IGhhdmUgYSBkZWZhdWx0IHRoZSB2aWV3ZXIgY2xlYXJlZC4gV2l0aG91dCB0aGlzIGEgcmVsb2FkIG9mIHRoZVxuICAvLyByZXBvcnQgKGEgY2hhdCBlZGl0LCBhIGRpYWxvZykgd291bGQgZmluZCBubyB2YWx1ZSBmb3IgdGhlIGdyb3VwIGFuZCBzZWVkXG4gIC8vIGl0cyBkZWZhdWx0IHN0cmFpZ2h0IGJhY2suIEEgY2hhbmdlIHRvIHRoZSBzdG9yZWQgZGVmYXVsdCByZWxlYXNlcyBpdC5cbiAgcHJpdmF0ZSBfY2xlYXJlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sOiBhIHNpbmdsZSByZXBvcnQtd2lkZSBidWNrZXQgb3ZlcnJpZGUgZm9yIGFsbFxuICAvLyB0aGUgdGlsZXMgdGhhdCBmb2xsb3cgaXQgKGZvbGxvd3NHcm91cEJ5KS4gVW5zZXQgPSBlYWNoIG9uZSB1c2VzIGl0c1xuICAvLyBhdXRob3JlZCBncmFudWxhcml0eS4gTmV2ZXJcbiAgLy8gc2F2ZWQgdG8gdGhlIHJlcG9ydCwgYW5kIGNhcnJpZWQgaW4gdGhlIGRhdGEgcmVxdWVzdCdzXG4gIC8vIGBzdGF0ZWAsIHNvIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaCB0byB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0b28uIE5hbWVkXG4gIC8vIGZvciB0aGUgYGZyZXF1ZW5jeWAgd2lyZSBrZXkgaXQgdHJhdmVscyB1bmRlciwgbm90IGZvciB0aGUgY29udHJvbCdzIGxhYmVsLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHZpZXdlci1jaG9zZW4gc29ydCwgYnkgY29tcG9uZW50IGlkLiBIZWxkIGhlcmUgcmF0aGVyIHRoYW4gb25seVxuICAvLyBpbiB0aGUgbGlzdCdzIEZzTGlzdCBzbyBpdCBzdXJ2aXZlcyB0aGUgbGlzdCBiZWluZyByZWNyZWF0ZWQgKGEgcGFnZSBzd2l0Y2gsXG4gIC8vIGEgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGFuZCBzbyBldmVyeSBjb25zdW1lciBvZiB2aWV3ZXIgc3RhdGUgcmVhZHMgb25lIHBsYWNlLlxuICBwcml2YXRlIF9saXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0U29ydD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyBzZWFyY2ggYm94IHRleHQgKGxpc3RTZWFyY2hUZXh0KSwgYnkgY29tcG9uZW50IGlkLiBBIGxpc3Qgd2l0aFxuICAvLyBhbiBlbXB0eSBib3ggaGFzIG5vIGVudHJ5LiBIZWxkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbnMgYXMgdGhlIHNvcnRzLCBhbmRcbiAgLy8gYmVjYXVzZSB0aGUgYm94IGxpdmVzIGluIHRoZSBjb21wb25lbnQgaGVhZGVyLCBub3QgaW4gdGhlIGxpc3QuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hlcyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgbGlzdHMsIGJ5IGNvbXBvbmVudCBpZCwgc28gYSBmaWx0ZXIgdG9nZ2xlIGNhbiB0ZWxsXG4gIC8vIHdoaWNoIG9mIHRoZW0gbG9zZSB0aGVpciBzZWFyY2ggYm94IChsaXN0U2VhcmNoYWJsZSkuXG4gIHByaXZhdGUgX2xpc3RzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydENvbXBvbmVudD4oKTtcblxuICAvLyBXaGV0aGVyIHRoZSBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoLiBMaXN0IHNlYXJjaCBhbmQgZWZmZWN0aXZlTG9jYWxlXG4gIC8vIHNoaXAgaW4gdGhlIHNhbWUgZnJhbWV3b3JrIGNoYW5nZSBzZXQsIHNvIGEgc2VydmVyIHRoYXQgc2VuZHMgbm9cbiAgLy8gZWZmZWN0aXZlTG9jYWxlIGhhcyBuZWl0aGVyLCBhbmQgaXRzIGxpc3RzIHNob3cgbm8gc2VhcmNoIGJveC5cbiAgcHJpdmF0ZSBfc2VydmVyU2VhcmNoZXMgPSBmYWxzZTtcblxuICAvLyBFbWl0cyB0aGUgaWQgb2YgdGhlIGxpc3Qgd2hvc2Ugc2VhcmNoIHRleHQgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaENoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIEVtaXRzIHRoZSBncm91cCBpZCB0aGF0IGNoYW5nZWQ7IGNvbXBvbmVudHMgbGlzdGVuIGZpbHRlcmVkIHRvIHRoZWlyIG93blxuICAvLyBncm91cCBpZHMuIG51bGwgPSBldmVyeXRoaW5nIGNoYW5nZWQgKHJlLWluaXQpLlxuICBwcml2YXRlIF9jaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgYW55dGhpbmcgaW4gdGhlIHZpZXdlciBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkLlxuICBwcml2YXRlIF9zdGF0ZUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBDb3VudHMgdGhlIGNoYW5nZXMgY2hhbmdlcygpIHJlcG9ydHMuIFRoZSBncm91cCB2YWx1ZXMsIHRoZSBncmFpbiBhbmRcbiAgLy8gdGhlIGxpc3Qgc3RhdGUgdGhhdCBkaWZmZXJzRnJvbURlZmF1bHRzIGNvbXBhcmVzIGFyZSB0aGUgcGxhaW4gZmllbGRzXG4gIC8vIGFib3ZlLCB3aGljaCBldmVyeSBzZXR0ZXIgcmVwb3J0cyB0aHJvdWdoIGNoYW5nZXMoKSAodGhleSBhcmUgc2hhcmVkXG4gIC8vIHdpdGggdGhlIGlubGluZSB2YWx1ZXMgYnVpbGQsIHNvIHRoZXkgc3RheSBhcyB0aGV5IGFyZSk7IHRoaXMgY291bnRlciBpc1xuICAvLyBob3cgdGhlIGNvbXB1dGVkIGhlYXJzIG9mIHRoZW0uIFRoZSBwYWdlLCBtYXRjaCBhbmQgZHJpbGxzIGJlbG93IGFyZVxuICAvLyBzaWduYWxzIGFuZFxuICAvLyBpcyByZWFkIGRpcmVjdGx5LiBUaGUgc3ViamVjdCBpcyB0aGlzIHNlcnZpY2UncyBvd24gYW5kIGlzIG5ldmVyXG4gIC8vIGNvbXBsZXRlZCwgc28gdGhlIHNpZ25hbCBsaXN0ZW5zIHRvIGl0IGV4YWN0bHkgYXMgbG9uZyBhcyB0aGUgc2VydmljZVxuICAvLyBsaXZlcy5cbiAgcHJpdmF0ZSBfcmV2aXNpb24gPSB0b1NpZ25hbCh0aGlzLl9zdGF0ZUNoYW5nZWQkLnBpcGUoc2NhbigoY291bnQpID0+IGNvdW50ICsgMSwgMCkpLCB7XG4gICAgaW5pdGlhbFZhbHVlOiAwLFxuICAgIG1hbnVhbENsZWFudXA6IHRydWUsXG4gIH0pO1xuXG4gIHByaXZhdGUgX3N0YXRlVmVyc2lvbiA9IHNpZ25hbCgwKTtcblxuICBwcml2YXRlIF9saXN0U29ydFJlc2V0cyA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIG51bWJlcj4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gVGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkOiB0aGUgdGlsZXMgYW5kIHBhZ2VzIHRoZSBzdGF0ZSBpcyBjaGVja2VkXG4gIC8vIGFnYWluc3QuXG4gIHByaXZhdGUgX3JlcG9ydCA9IHNpZ25hbDxSZXBvcnQgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgb3BlbiBwYWdlLCBzZXQgYnkgdGhlIGhvc3QgYXMgdGhlIHZpZXdlciBtb3ZlcyBiZXR3ZWVuIHBhZ2VzLlxuICBwcml2YXRlIF9wYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gSG93IHRoZSBncm91cHMgY29tYmluZTogJ2FsbCcgKHRoZSBkZWZhdWx0KSBvciAnYW55Jy5cbiAgcHJpdmF0ZSBfbWF0Y2ggPSBzaWduYWw8UmVwb3J0RmlsdGVyTWF0Y2g+KCdhbGwnKTtcblxuICAvLyBFYWNoIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0LCBieSBjb21wb25lbnQgaWQuIEEgY2hhcnQgYXQgaXRzIHRvcFxuICAvLyBoYXMgbm8gZW50cnksIGFuZCBvbmx5IGEgY2hhcnQgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfZHJpbGxzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10+PihuZXcgTWFwKCkpO1xuXG4gIC8vIEVtaXRzIHRoZSBpZCBvZiB0aGUgY2hhcnQgd2hvc2UgZHJpbGwgcGF0aCBjaGFuZ2VkLlxuICBwcml2YXRlIF9kcmlsbENoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSBsYXlvdXQgYSB2aWV3ZXIgcHV0IGVhY2ggdGFibGUgdGlsZSBpbiwgYnkgY29tcG9uZW50IGlkLCB3aGlsZSBpdFxuICAvLyBkaWZmZXJzIGZyb20gdGhlIHRpbGUncyBhdXRob3JlZCBsYXlvdXQsIHdpdGggdGhlIGF1dGhvcmVkIGxheW91dCBpdCB3YXNcbiAgLy8gY2hhbmdlZCBmcm9tIChSZXBvcnRHcmlkU2Vzc2lvbkxheW91dC5iYXNlKS4gQSB0YWJsZSBzaG93aW5nIGl0cyBhdXRob3JlZFxuICAvLyBsYXlvdXQgaGFzIG5vIGVudHJ5LCBhbmQgb25seSBhIHRhYmxlIGhhcyBvbmUuXG4gIHByaXZhdGUgX2dyaWRMYXlvdXRzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgUmVwb3J0R3JpZFNlc3Npb25MYXlvdXQ+PihuZXcgTWFwKCkpO1xuXG4gIC8vIFRoZSBncm91cHMgYSB2aWV3ZXIgbGVmdCBvcGVuIGluIGVhY2ggdGFibGUgdGlsZSwgYnkgY29tcG9uZW50IGlkLCBzbyBhXG4gIC8vIHRpbGUgZHJhd24gYWdhaW4gKGEgcGFnZSBzd2l0Y2gpIG9wZW5zIHRoZW0uIFNlc3Npb24gb25seTogbm8gQ2xlYXJcbiAgLy8gcmVzZXRzIHRoZW0sIGRpZmZlcnNGcm9tRGVmYXVsdHMgbmV2ZXIgcmVhZHMgdGhlbSwgYW5kIGZzLWdyaWQgZHJvcHNcbiAgLy8gdGhlbSBpdHNlbGYgb25jZSB0aGUgcm93IGxldmVscyBjaGFuZ2UuXG4gIHByaXZhdGUgX2dyaWRFeHBhbnNpb25zID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgR3JpZEV4cGFuc2lvbj4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gQnkgdGFibGUgdGlsZSwgdGhlIGNvbHVtbiBmaWx0ZXIgYSBncm91cC1ieSBjaGFuZ2UgdG9vayBvdXQgb2YgaXQgYW5kXG4gIC8vIHRoZSBncmFpbiB0aGUgdGFibGUgbm93IGdyb3VwcyBieSAoX2dyYWluR3JpZExheW91dHMoKSksIGZvciBmcy1ncmlkJ3NcbiAgLy8gc3RhdHVzIGxpbmUuIGZzLWdyaWQgaGlkZXMgaXQgb25jZSB0aGUgZmllbGQgaXMgZmlsdGVyZWQgYWdhaW47IGEgQ2xlYXJcbiAgLy8gZHJvcHMgaXQuXG4gIHByaXZhdGUgX2dyaWRDbGVhcmVkRmlsdGVycyA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIEdyaWRDbGVhcmVkRmlsdGVyPj4obmV3IE1hcCgpKTtcblxuICAvLyBUaGUgdGVtcG9yYXJ5IGxheWVyOiBrZXB0IGFwYXJ0IGZyb20gZXZlcnl0aGluZyBhYm92ZSwgc28gc25hcHNob3QoKVxuICAvLyBhbmQgZGlmZmVyc0Zyb21EZWZhdWx0cyBuZXZlciByZWFkIGl0LlxuICBwcml2YXRlIF90ZW1wb3JhcnkgPSBzaWduYWw8UmVwb3J0VGVtcG9yYXJ5U3RhdGU+KGVtcHR5VGVtcG9yYXJ5U3RhdGUoKSk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIHB1YmxpYyBpbml0KHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNUaW1lem9uZSA9IHRoaXMudGltZXpvbmUoKTtcblxuICAgIC8vIFNldCBmaXJzdDogdGhlIGRlZmF1bHRzIHNlZWRlZCBiZWxvdyByZXNvbHZlIHRoZWlyIHJlbGF0aXZlIHByZXNldHMgaW4gaXQuXG4gICAgdGhpcy50aW1lem9uZS5zZXQocmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCkpO1xuICAgIHRoaXMuZm9ybWF0Q29udGV4dC5zZXQocmVzb2x2ZUZvcm1hdENvbnRleHQocmVwb3J0KSk7XG4gICAgLy8gQmVmb3JlIHRoZSBwcnVuaW5nOiBsaXN0U2VhcmNoYWJsZSByZWFkcyBpdC5cbiAgICB0aGlzLl9zZXJ2ZXJTZWFyY2hlcyA9IHJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbWV6b25lQ2hhbmdlZCA9IHByZXZpb3VzVGltZXpvbmUgIT09IHRoaXMudGltZXpvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIGdyb3VwKTtcbiAgICAgIHRoaXMuX3NlZWQoZ3JvdXAsIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCkgPz8gbnVsbCwgdGltZXpvbmVDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgdGhpcy5fcHJ1bmUocmVwb3J0KTtcbiAgICB0aGlzLl9wcnVuZVBhZ2VTdGF0ZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZShncm91cElkOiBudW1iZXIpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcbiAgfVxuXG4gIC8vIEEgYmFyJ3MgdmFsdWUgZm9yIGEgZ3JvdXAuIEEgZGF0ZSByYW5nZSBrZWVwcyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIG9ubHlcbiAgLy8gd2hpbGUgaXRzIGRheXMgYXJlIHN0aWxsIHRoZSBzdG9yZWQgZGF5czogdGhlIGJhcnMgcmUtc2V0IGV2ZXJ5IGdyb3VwIHRoZXlcbiAgLy8gc2hvdyB3aGVuZXZlciBhbnkgb25lIG9mIHRoZW0gY2hhbmdlcywgYW5kIGFuIHVudG91Y2hlZCByb2xsaW5nIHJhbmdlIG11c3RcbiAgLy8ga2VlcCBpdHMgbmFtZSByYXRoZXIgdGhhbiB0dXJuIGludG8gdHdvIGZpeGVkIGRhdGVzLiBBbnkgb3RoZXIgcmFuZ2UsIGFcbiAgLy8gZGF0ZSBwaWNrZXIgcHJlc2V0IGluY2x1ZGVkLCBpcyBzdG9yZWQgYXMgdGhlIGZpeGVkIGRhdGVzIGl0IHNob3dzLlxuICBwdWJsaWMgc2V0VmFsdWUoZ3JvdXBJZDogbnVtYmVyLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG5cbiAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpPy5jb25maWc/LmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXBJZCwgdGhpcy5fd2l0aFByZXNldCh0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpO1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXBJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgcmVsYXRpdmUgcHJlc2V0IG5hbWUgYXMgdG9kYXkncyByYW5nZSBpbiB0aGUgcmVwb3J0J3Mgem9uZSwgb3IgbnVsbCBmb3JcbiAgLy8gYSBuYW1lIGl0IGRvZXMgbm90IGtub3cuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgLy8gRWFjaCB0YWJsZSB0aGF0IGZvbGxvd3MgdGhlIGdyb3VwLWJ5IGhhcyBpdHMgZmlsdGVyIG9uIHRoZSBncm91cC1ieSdzXG4gIC8vIGZpZWxkIG1vdmVkIHRvIHRoZSBuZXcgZ3JhaW4gZmlyc3QgKF9ncmFpbkdyaWRMYXlvdXRzKCkpLCBzbyBhIHRhYmxlIG9uXG4gIC8vIHNjcmVlbiByZWFkcyBvbmNlLCB3aXRoIGJvdGguXG4gIHB1YmxpYyBzZXRGcmVxdWVuY3koZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLl9ncmFpbkdyaWRMYXlvdXRzKCk7XG4gICAgdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQubmV4dCgpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIGdyb3VwLWJ5IGdyYWluIGNoYW5nZXMg4oCUIGV2ZXJ5IHRpbGUgdGhhdCBmb2xsb3dzIGl0XG4gIC8vIGxpc3RlbnMgc28gaXQgcmVmZXRjaGVzIGFuZCByZS1idWNrZXRzICh0aGUgb3ZlcnJpZGUgaXNuJ3Qgc2NvcGVkIHRvIGFueVxuICAvLyBmaWx0ZXIgZ3JvdXAsIHNvIGNoYW5nZXNGb3IoKSBjYW4ndCBjYXJyeSBpdCkuXG4gIHB1YmxpYyBmcmVxdWVuY3lDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSBzb3J0IHRoZSB2aWV3ZXIgbGFzdCBmZXRjaGVkIGEgbGlzdCB3aXRoLCBvciBudWxsIHdoZW4gaXQgaGFzbid0IHNvcnRlZFxuICAvLyAodGhlIGxpc3QgdGhlbiBmYWxscyBiYWNrIHRvIGl0cyBhdXRob3JlZCBzb3J0KS5cbiAgcHVibGljIGxpc3RTb3J0KGNvbXBvbmVudElkOiBudW1iZXIpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNvcnQgd2hlbiBpdCBpcyB0aGUgdmlld2VyJ3Mgb3duOiBhIHNvcnQgdGhhdCBpcyB0aGVcbiAgLy8gbGlzdCdzIGF1dGhvcmVkIGZpcnN0IHRlcm0gaXMgdGhlIGxpc3QncyBkZWZhdWx0LCBub3QgYSBjaG9pY2UsIHNvIGl0XG4gIC8vIGNsZWFycyB0aGUgZW50cnkgaW5zdGVhZCAodGhlIHJ1bGUgc25hcHNob3QoKSBhcHBsaWVzKS4gT3RoZXJ3aXNlIGFcbiAgLy8gbGlzdCdzIGZpcnN0IGZldGNoIHdvdWxkIHJlY29yZCBpdHMgc2VlZGVkIGF1dGhvcmVkIHRlcm0sIGFuZCBhIGxpc3QgdGhlXG4gIC8vIGFnZW50IHJlLXNvcnRzIGxhdGVyIGluIHRoZSBzZXNzaW9uIHdvdWxkIGtlZXAgc2VuZGluZyB0aGUgb2xkIHRlcm1cbiAgLy8gZmlyc3QuIERlbGliZXJhdGVseSBlbWl0cyBubyBjaGFuZ2U6IHRoZSBsaXN0IHNldHMgdGhpcyBmcm9tIHRoZSBmZXRjaFxuICAvLyB0aGF0IGFscmVhZHkgcmFuIHdpdGggdGhhdCBzb3J0LCBzbyBhIG5vdGlmaWNhdGlvbiB3b3VsZCBvbmx5IG1ha2UgaXRcbiAgLy8gcmVmZXRjaCB0aGUgc2FtZSByb3dzLiBPbmx5IGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldExpc3RTb3J0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBzb3J0OiBSZXBvcnRTb3J0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSB0ZXh0IGEgbGlzdCBpcyBzZWFyY2hlZCBieSwgb3IgbnVsbCB3aGVuIGl0cyBzZWFyY2ggYm94IGlzIGVtcHR5LlxuICBwdWJsaWMgbGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBXaGV0aGVyIGEgbGlzdCBzaG93cyB0aGUgc2VhcmNoIGJveCBvdmVyIGl0cyB0ZXh0IGNvbHVtbnM6IGl0IGRvZXMgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaCAoc2VlIF9zZXJ2ZXJTZWFyY2hlcyksIHVubGVzcyBvbmUgb2YgaXRzIGxpdmVcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIGEga2V5d29yZCBncm91cCBpdHMgaGVhZGVyIHNob3dzLiBBIGJhciBzaG93cyBvbmUgc2VhcmNoXG4gIC8vIGJveCAoaXRzIGxhc3Qga2V5d29yZCBpdGVtKSwgYW5kIHRoYXQgb25lIGlzIHRoZSBhdXRob3Incy4gVGhlIGhlYWRlciwgdGhlXG4gIC8vIHBydW5pbmcsIHRoZSBkYXRhIHJlcXVlc3Qgc3RhdGUgYW5kIHRoZSBleHBvcnRzIGFsbCByZWFkXG4gIC8vIHRoaXMgb25lIHJ1bGUsIHNvIG5vIHNlYXJjaCBuYXJyb3dzIGEgbGlzdCB3aG9zZSBzY3JlZW4gaGFzIG5vIGJveCBzaG93aW5nXG4gIC8vIGl0LCBhbmQgbm8gZXhwb3J0IHRpdGxlcyBhIHNlYXJjaCB0aGUgc2VydmVyIGRpZCBub3QgYXBwbHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoYWJsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJTZWFyY2hlc1xuICAgICAgJiYgY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgJiYgIShjb21wb25lbnQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkXG4gICAgICAgICAgJiYgIXRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKVxuICAgICAgICAgICYmIGdyb3VwPy50eXBlID09PSAna2V5d29yZCdcbiAgICAgICAgICAmJiAoZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpOyBhbiBlbXB0eSBib3ggY2xlYXJzXG4gIC8vIGl0LiBUaGUgaGVhZGVyIGNhbGxzIHRoaXMgb24gZXZlcnkgY2hhbmdlIG9mIGFueSBvZiBpdHMgaXRlbXMsIHNvIHRoZVxuICAvLyBsaXN0IGFuZCBjaGFuZ2VzKCkgaGVhciBhYm91dCBpdCBvbmx5IHdoZW4gdGhlIHN0b3JlZCB0ZXh0IGFjdHVhbGx5IGNoYW5nZWQuXG4gIHB1YmxpYyBzZXRMaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlYXJjaCA9IGxpc3RTZWFyY2hUZXh0KHRleHQpO1xuXG4gICAgaWYgKHNlYXJjaCA9PT0gKHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/ICcnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50SWQsIHNlYXJjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5uZXh0KGNvbXBvbmVudElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSBjb25maWcgY29sdW1uIG5hbWVzIGEgdmlld2VyIGhpZCBvbiBhIGxpc3Q7IG5vbmUgd2hlbiBpdCBzaG93cyB0aGVtIGFsbC5cbiAgcHVibGljIGhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SGlkZGVuKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgdGhlIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdCwga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczpcbiAgLy8gbmFtZXMgdGhlIGxpc3QgY2Fubm90IGhpZGUgYXJlIGRyb3BwZWQsIGFuZCBub25lIChvciBldmVyeSBjb2x1bW4pIGNsZWFyc1xuICAvLyB0aGUgZW50cnkuIE9ubHkgY2hhbmdlcygpIGhlYXJzIGFib3V0IGl0LCBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0SGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgIGlmIChzYW1lTmFtZXMoaGlkZGVuLCB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMubGlzdEhpZGRlbigpKTtcblxuICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciBvbmUgbGlzdCdzIHNlYXJjaCB0ZXh0IGNoYW5nZXMsIHNvIHRoYXQgbGlzdCByZWZldGNoZXMuXG4gIHB1YmxpYyBsaXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChpZCkgPT4gaWQgPT09IGNvbXBvbmVudElkKSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIHZpZXdlciBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkOiBhIGdyb3VwIHZhbHVlLCB0aGVcbiAgLy8gZ3JhaW4sIHRoZSBtYXRjaCwgdGhlIHBhZ2UsIGEgbGlzdCBzb3J0LCBzZWFyY2ggb3IgaGlkZGVuIGNvbHVtbnMsIGFcbiAgLy8gZHJpbGwgcGF0aCwgYSByZXNldCBvciBhIChyZSlsb2FkIG9mIHRoZSByZXBvcnQuXG4gIHB1YmxpYyBjaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGlzRmlsdGVyRGlzYWJsZWQoZmlsdGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgZ3JvdXBJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmFkZChmaWx0ZXJJZCk7XG4gICAgfVxuXG4gICAgLy8gVHVybmluZyBhIGtleXdvcmQgZmlsdGVyIGJhY2sgb24gdGFrZXMgaXRzIGxpc3QncyBzZWFyY2ggYm94IGF3YXksIGFuZFxuICAgIC8vIHRoZSBzZWFyY2ggd2l0aCBpdC4gVGhlIGxpc3QgcmVmZXRjaGVzIG9uIHRoZSBncm91cCBjaGFuZ2UgYmVsb3cuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gT05FIGNvbXBvbmVudDogYW55IGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiBpdHNcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIChvciBhIGZ1bGwgcmUtaW5pdCkuIFRoZSBjb21wb25lbnQgaXMgcmVhZCBvbiBlYWNoXG4gIC8vIGV2ZW50LCBuZXZlciBjYXB0dXJlZCBhdCBzdWJzY3JpYmU6IGEgdGlsZSBrZWVwcyBpdHMgc3Vic2NyaXB0aW9uIGFjcm9zc1xuICAvLyByZXBvcnQgbG9hZHMsIHNvIGEgZmlsdGVyIGFkZGVkIHRvIGl0IHdoaWxlIHRoZSByZXBvcnQgaXMgb3BlbiAodGhlIE1DUCxcbiAgLy8gYSBjaGF0IGVkaXQsIHRoZSBzZXR0aW5ncyBkaWFsb2cpIHJlYWNoZXMgaXQgb24gdGhlIGZpcnN0IGNoYW5nZSBvZiBpdHNcbiAgLy8gZ3JvdXAuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yKGNvbXBvbmVudDogKCkgPT4gUmVwb3J0Q29tcG9uZW50KTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpID0+IGdyb3VwSWQgPT09IG51bGxcbiAgICAgICAgICB8fCAoY29tcG9uZW50KCkuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCA9PT0gZ3JvdXBJZCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gQU5ZIG9mIGEgc2V0IG9mIGNvbXBvbmVudHMgdGhhdCBjb21lcyBhbmQgZ29lc1xuICAvLyAoYSBwYWdlJ3MgdmFsdWVzKTogYSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgdGhlaXIgZmlsdGVycyBiZWxvbmdzIHRvLlxuICAvLyBMaWtlIGNoYW5nZXNGb3IsIHRoZSBzZXQgaXMgcmVhZCBvbiBlYWNoIGV2ZW50LCBzbyBvbmUgc3Vic2NyaXB0aW9uXG4gIC8vIGZvbGxvd3MgdGhlIHNldCBhcyB0aGUgcmVwb3J0IHJlbG9hZHMuIFVubGlrZSBpdCwgYSBmdWxsIHJlLWluaXQgKG51bGwpXG4gIC8vIGlzIG5vdCBwYXNzZWQgb246IGluaXQoKSBydW5zIG9uIGEgcmVwb3J0IChyZSlsb2FkLCBhbmQgYSBjYWxsZXIgb2YgdGhpc1xuICAvLyBjaGVja3Mgb24gdGhhdCByZWxvYWQgaXRzZWxmIHdoZXRoZXIgdGhlIGZpbHRlciB2YWx1ZXMgaXRzIGNvbXBvbmVudHNcbiAgLy8gYXJlIHJlYWQgd2l0aCBtb3ZlZC5cbiAgcHVibGljIGNoYW5nZXNGb3JBbnkoY29tcG9uZW50czogKCkgPT4gUmVwb3J0Q29tcG9uZW50W10pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKTogZ3JvdXBJZCBpcyBudW1iZXIgPT4gZ3JvdXBJZCAhPT0gbnVsbFxuICAgICAgICAgICYmIGNvbXBvbmVudHMoKS5zb21lKChjb21wb25lbnQpID0+IChjb21wb25lbnQuZmlsdGVycyA/PyBbXSlcbiAgICAgICAgICAgIC5zb21lKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkID09PSBncm91cElkKSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBncm91cCB2YWx1ZXMgcmVzb2x2ZWQgaW50byB0aGlzIGNvbXBvbmVudCdzIG1lbWJlci1maWx0ZXIgdmFsdWVzIOKAlFxuICAvLyB3aGF0IHRoZSBkYXRhIHJlcXVlc3QgY2Fycmllcy4gRGlzYWJsZWQgZmlsdGVycyAoYXV0aG9yZWQgb3Igc2Vzc2lvbikgYXJlXG4gIC8vIHNraXBwZWQgZW50aXJlbHkuXG4gIHB1YmxpYyByZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBjb21wb25lbnQuZmlsdGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFmaWx0ZXIuZW5hYmxlZCB8fCB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlci5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB2YWx1ZSA/IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKSA6IG51bGw7XG5cbiAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgcmVzb2x2ZWQucHVzaCh7IGZpbHRlcklkOiBmaWx0ZXIuaWQsIC4uLmZpZWxkcyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIHNldCwgb25lIGVudHJ5IHBlciBmaWx0ZXIgZ3JvdXAsIGZvciB0aGUgcmVwb3J0IGNoYXQ6XG4gIC8vIHRoZSBhZ2VudCByZWFkcyBpdCB0byBrbm93IHdoYXQgaXMgb24gc2NyZWVuLiBHcm91cCBvcmRlciwgbm90IHRoZSBvcmRlclxuICAvLyB0aGUgdmFsdWVzIHdlcmUgc2V0IGluLCBzbyB0aGUgc2FtZSBzdGF0ZSBhbHdheXMgcmVhZHMgdGhlIHNhbWUuIEEgZ3JvdXBcbiAgLy8gd2l0aCBub3RoaW5nIGluIGl0IGlzIGxlZnQgb3V0LCBhbmQgYSBzYXZlZCBkZWZhdWx0IGNvdW50cyB1bnRpbCB0aGVcbiAgLy8gdmlld2VyIGNoYW5nZXMgaXQuIFBlci1maWx0ZXIgdG9nZ2xlcyBhcmUgYSBjb21wb25lbnQncyBvd24gYnVzaW5lc3MsIHNvXG4gIC8vIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgdmlld2VyRmlsdGVycygpOiBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fdmFsdWVzLmVudHJpZXMoKV1cbiAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpXG4gICAgICAubWFwKChbZ3JvdXBJZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gZmllbGRzID8geyBncm91cElkLCAuLi5maWVsZHMgfSA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyID0+IGVudHJ5ICE9PSBudWxsKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IHRpbGUncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIE9ubHkgYSB0aWxlIGJlY29tZXMgYSBmaWxlIChpc1RpbGUpLCBzbyBubyBvdGhlclxuICAvLyBjb21wb25lbnQncyBlbnRyaWVzIHJpZGUgYWxvbmcuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gaXNUaWxlKGNvbXBvbmVudCkpXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UGFnZShwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocGFnZUlkID09PSB0aGlzLl9wYWdlSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgY2hhbmdlIG9mIG1hdGNoIGNhbiBjaGFuZ2UgZXZlcnkgdGlsZSBhIGdyb3VwIHdpdGggYSB2YWx1ZSBuYXJyb3dzLCBzb1xuICAvLyBldmVyeSB0aWxlIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TWF0Y2gobWF0Y2g6IFJlcG9ydEZpbHRlck1hdGNoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dDogUmVwb3J0RmlsdGVyTWF0Y2ggPSBtYXRjaCA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLl9tYXRjaCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWF0Y2guc2V0KG5leHQpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0OyBlbXB0eSB3aGlsZSB0aGUgY2hhcnQgaXMgYXQgaXRzIHRvcC5cbiAgLy8gSXQgcmVhZHMgYSBzaWduYWwsIHNvIGEgdGVtcGxhdGUgdGhhdCBzaG93cyBpdCByZXBhaW50cyB3aGVuIGl0IG1vdmVzLlxuICBwdWJsaWMgZHJpbGwoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZHJpbGxzKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBjaGFydCdzIGRyaWxsIHBhdGgsIGtlcHQgdG8gY2xlYW5EcmlsbFBhdGg7IGFuIGVtcHR5IHBhdGggaXNcbiAgLy8gdGhlIGNoYXJ0J3MgdG9wLiBPbmx5IGEgY2hhcnQgb2YgdGhlIG9wZW4gcmVwb3J0IGRyaWxsczogYSBwYXRoIGZvciBhbnlcbiAgLy8gb3RoZXIgY29tcG9uZW50IGlzIGlnbm9yZWQuIE9ubHkgdGhhdCBjaGFydCBhbmQgY2hhbmdlcygpIGhlYXIgYWJvdXQgaXQsXG4gIC8vIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXREcmlsbChjb21wb25lbnRJZDogbnVtYmVyLCBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSBjbGVhbkRyaWxsUGF0aChwYXRoKTtcbiAgICBpZiAoIXRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpIHx8IHNhbWVEcmlsbFBhdGgoa2VwdCwgdGhpcy5kcmlsbChjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RHJpbGxQYXRoKGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICB0aGlzLl9kcmlsbENoYW5nZWQkLm5leHQoY29tcG9uZW50SWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGNoYXJ0J3MgZHJpbGwgcGF0aCBjaGFuZ2VzLCBzbyB0aGF0IGNoYXJ0IHJlZmV0Y2hlcy5cbiAgcHVibGljIGRyaWxsQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RyaWxsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRha2VzIHRoZSBkcmlsbCBwYXRoIGEgY2hhcnQncyBhbnN3ZXIgYXBwbGllZCBhcyB0aGUgY2hhcnQncyBvd246IHRoZVxuICAvLyBzZXJ2ZXIga2VlcHMgdGhlIGxvbmdlc3QgcGFydCBvZiBhIHNlbnQgcGF0aCBpdCBjYW4gYXBwbHksIHNvIGEgbGF0ZXJcbiAgLy8gc2F2ZSBob2xkcyB0aGF0IHBhcnQgb25seS4gVGhlIGNoYXJ0IGhhcyBqdXN0IHJlYWQgdGhhdCBwYXRoLCBzbyBvbmx5XG4gIC8vIGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdC4gVHJ1ZSB3aGVuIHRoZSBwYXRoIGNoYW5nZWQuXG4gIHB1YmxpYyBhZG9wdERyaWxsKGNvbXBvbmVudElkOiBudW1iZXIsIHBhdGg6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2VwdCA9IGNsZWFuRHJpbGxQYXRoKHBhdGgpO1xuICAgIGlmICghdGhpcy5faXNDaGFydChjb21wb25lbnRJZCkgfHwgc2FtZURyaWxsUGF0aChrZXB0LCB0aGlzLmRyaWxsKGNvbXBvbmVudElkKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBUaGUgbGF5b3V0IGEgdGFibGUgdGlsZSBpcyBvbiBzY3JlZW4gaW46IHRoZSB2aWV3ZXIncyBvd24gd2hpbGUgdGhleVxuICAvLyBjaGFuZ2VkIGl0IGZyb20gdGhlIGxheW91dCBhdXRob3JlZCBub3csIGVsc2UgdGhlIGF1dGhvcmVkIG9uZS4gSXQgcmVhZHNcbiAgLy8gYSBzaWduYWwsIHNvIGEgdGlsZSB0aGF0IHNob3dzIGl0IHJlZHJhd3Mgd2hlbiBlaXRoZXIgbW92ZXMuXG4gIHB1YmxpYyBncmlkTGF5b3V0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZExheW91dCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KSA/PyBhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8vIFRoZSB2aWV3ZXIncyBvd24gbGF5b3V0IG9mIGEgdGFibGUgdGlsZSB3aGlsZSBpdCBkaWZmZXJzIGZyb20gdGhlIGxheW91dFxuICAvLyBhdXRob3JlZCBub3csIGVsc2UgbnVsbDogdGhlIHRpbGUgc2hvd3MgaXRzIHN0b3JlZCBsYXlvdXQuIFRoZSBjaGF0XG4gIC8vIHNlbmRzIGl0IGFzIHRoZSB0aWxlJ3MgbGF5b3V0LlxuICBwdWJsaWMgZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBHcmlkTGF5b3V0IHwgbnVsbCB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX2dyaWRMYXlvdXRzKCkuZ2V0KGNvbXBvbmVudC5pZCk7XG5cbiAgICByZXR1cm4gc2Vzc2lvbj8uYmFzZSA9PT0gZ3JpZExheW91dEtleShhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KSlcbiAgICAgID8gc2Vzc2lvbi5sYXlvdXRcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgdGhlIGxheW91dCBhIHZpZXdlciBwdXQgYSB0YWJsZSB0aWxlIGluIChhIHJlLXBpdm90LCBhIHNvcnQsIGFcbiAgLy8gY29sdW1uIGZpbHRlcikuIE9uZSB0aGF0IGRyYXdzIHRoZSBhdXRob3JlZCBsYXlvdXQgY2xlYXJzIHRoZSBlbnRyeSwgc29cbiAgLy8gdGhlIHRpbGUgcmVhZHMgYXMgc3RvcmVkIGFnYWluLiBmcy1ncmlkIHJlYWRzIHRoZSBjaGFuZ2UgaXRzZWxmLCBzbyBvbmx5XG4gIC8vIGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdCwgYW5kIG9ubHkgb24gYSByZWFsIGNoYW5nZS5cbiAgcHVibGljIHNldEdyaWRMYXlvdXQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGxheW91dDogR3JpZExheW91dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wdXRHcmlkTGF5b3V0KGNvbXBvbmVudCwgbGF5b3V0KSkge1xuICAgICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGNvbHVtbiBmaWx0ZXIgYSBncm91cC1ieSBjaGFuZ2UgdG9vayBvdXQgb2YgYSB0YWJsZSB0aWxlLCBvciBudWxsXG4gIC8vIChfZ3JpZENsZWFyZWRGaWx0ZXJzKS5cbiAgcHVibGljIGdyaWRDbGVhcmVkRmlsdGVyKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZENsZWFyZWRGaWx0ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzKCkuZ2V0KGNvbXBvbmVudC5pZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBncm91cHMgYSB2aWV3ZXIgbGVmdCBvcGVuIGluIGEgdGFibGUgdGlsZSwgb3IgdW5kZWZpbmVkOiB0aGUgdGlsZVxuICAvLyBvcGVucyBhcyBpdHMgbGF5b3V0IHNheXMuXG4gIHB1YmxpYyBncmlkRXhwYW5zaW9uKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZEV4cGFuc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRFeHBhbnNpb25zKCkuZ2V0KGNvbXBvbmVudC5pZCk7XG4gIH1cblxuICAvLyBSZWNvcmRzIHRoZSBncm91cHMgb3BlbiBpbiBhIHRhYmxlIHRpbGUsIGFzIGZzLWdyaWQgd3JpdGVzIHRoZW0gb3V0LiBJdFxuICAvLyBjaGFuZ2VzIG5vIHJlYWQsIHNvIG5vdGhpbmcgaGVhcnMgYWJvdXQgaXQuXG4gIHB1YmxpYyBzZXRHcmlkRXhwYW5zaW9uKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBleHBhbnNpb246IEdyaWRFeHBhbnNpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgIT09ICdncmlkJyB8fCAhZXhwYW5zaW9uIHx8IHRoaXMuX2dyaWRFeHBhbnNpb25zKCkuZ2V0KGNvbXBvbmVudC5pZCkgPT09IGV4cGFuc2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2dyaWRFeHBhbnNpb25zLnNldChuZXcgTWFwKHRoaXMuX2dyaWRFeHBhbnNpb25zKCkpLnNldChjb21wb25lbnQuaWQsIGV4cGFuc2lvbikpO1xuICB9XG5cbiAgLy8gVGhlIGR1cmFibGUgc3RhdGUgb24gc2NyZWVuIGFzIG9uZSBkb2N1bWVudDogdGhlIHBhZ2UsIGV2ZXJ5IGdyb3VwIHRoZVxuICAvLyByZXBvcnQgaGFzIChudWxsIHdoZW4gaXQgaG9sZHMgbm90aGluZywgYSBjbGVhcmVkIGRlZmF1bHQgaW5jbHVkZWQpLCB0aGVcbiAgLy8gbWF0Y2gsIHRoZSBncmFpbiwgYW5kIGVhY2ggdGlsZSdzIHNvcnQsIHNlYXJjaCwgaGlkZGVuIGNvbHVtbnMgYW5kIGRyaWxsXG4gIC8vIHBhdGggd2hlcmUgdGhleSBkaWZmZXIgZnJvbSB0aGUgYXV0aG9yZWQgdGlsZS4gQSBkYXRlIHJhbmdlIHRoYXQgc3RpbGxcbiAgLy8gY2FycmllcyBpdHMgcmVsYXRpdmUgcHJlc2V0IGlzIHdyaXR0ZW4gYXMgdGhhdCBwcmVzZXQsIHdoYXRldmVyIHRvZGF5IGlzXG4gIC8vICh0b1N0b3JlZEdyb3VwVmFsdWUpLiBUaGUgdGVtcG9yYXJ5IGxheWVyIGlzIG5ldmVyIHBhcnQgb2YgaXQuXG4gIHB1YmxpYyBzbmFwc2hvdCgpOiBSZXBvcnRTdGF0ZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogUmVwb3J0U3RhdGVTbmFwc2hvdCA9IHt9O1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpKSB7XG4gICAgICBzbmFwc2hvdC5wYWdlSWQgPSB0aGlzLl9wYWdlSWQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZnJlcXVlbmN5KSB7XG4gICAgICBzbmFwc2hvdC5ncm91cEJ5ID0gdGhpcy5fZnJlcXVlbmN5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXRjaCgpID09PSAnYW55Jykge1xuICAgICAgc25hcHNob3QubWF0Y2ggPSAnYW55JztcbiAgICB9XG5cbiAgICBzbmFwc2hvdC5ncm91cHMgPSB0aGlzLl9zbmFwc2hvdEdyb3VwcygpO1xuXG4gICAgY29uc3QgdGlsZXMgPSB0aGlzLl9zbmFwc2hvdFRpbGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRpbGVzKS5sZW5ndGgpIHtcbiAgICAgIHNuYXBzaG90LnRpbGVzID0gdGlsZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzIGFzIGEgc25hcHNob3Q6IGV2ZXJ5IGdyb3VwIGF0IGl0cyBhdXRob3JlZFxuICAvLyBkZWZhdWx0IChudWxsIHdoZW4gaXQgaGFzIG5vbmUpLCBubyBtYXRjaCwgZ3JhaW4gb3IgdGlsZSBzdGF0ZS5cbiAgcHVibGljIGF1dGhvcmVkQ29uZmlnKCk6IFJlcG9ydFN0YXRlU25hcHNob3Qge1xuICAgIGNvbnN0IGdyb3VwczogUmVjb3JkPG51bWJlciwgRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbD4gPSB7fTtcblxuICAgIHRoaXMuX2dyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgZ3JvdXBzW2dyb3VwLmlkXSA9IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGdyb3VwcyB9O1xuICB9XG5cbiAgLy8gUHV0cyB0aGUgc2NyZWVuIGJhY2sgb24gdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzIG9uIHRoZSBwYWdlIGl0IGlzXG4gIC8vIG9uOiBldmVyeSBncm91cCBhdCBpdHMgZGVmYXVsdCwgbWF0Y2ggJ2FsbCcsIG5vIGdyYWluLCBhbmQgZXZlcnkgdGlsZSBhdFxuICAvLyBpdHMgYXV0aG9yZWQgc29ydCwgc2VhcmNoLCBjb2x1bW5zIGFuZCB0b3AuIENsZWFycyB0aGUgdGVtcG9yYXJ5IGxheWVyLlxuICAvLyBUaGUgdGlsZXMgc3RheSBhbmQgcmVsb2FkIGluIHBsYWNlLCBleGNlcHQgYSBsaXN0IHdob3NlIHNvcnQgdGhpcyBtb3ZlZFxuICAvLyAobGlzdFNvcnRSZXNldHMpLiBFdmVyeSBjaGFuZ2UgaXMgYW5ub3VuY2VkIG9uY2UsIGF0IHRoZSBlbmQuXG4gIHB1YmxpYyByZXNldFRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZnJlcXVlbmN5O1xuICAgIGNvbnN0IHNvcnRzID0gbmV3IE1hcCh0aGlzLl9saXN0U29ydHMpO1xuXG4gICAgdGhpcy5fdGVtcG9yYXJ5LnNldChlbXB0eVRlbXBvcmFyeVN0YXRlKCkpO1xuICAgIHRoaXMuX2dyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gdGhpcy5fc2VlZEF1dGhvcmVkKGdyb3VwKSk7XG4gICAgdGhpcy5fbWF0Y2guc2V0KCdhbGwnKTtcbiAgICB0aGlzLl9mcmVxdWVuY3kgPSBudWxsO1xuICAgIHRoaXMuX2NsZWFyVGlsZXMoKTtcbiAgICB0aGlzLl9jb3VudFNvcnRSZXNldHMoc29ydHMpO1xuICAgIHRoaXMuX25vdGlmeVJlc2V0KGZyZXF1ZW5jeSk7XG4gIH1cblxuICAvLyBQdXRzIG9ubHkgYGdyb3VwSWRzYCBiYWNrIG9uIHRoZWlyIGF1dGhvcmVkIGRlZmF1bHRzLiBBIHRpbGUgaGVhZGVyJ3NcbiAgLy8gJ0NsZWFyIGZpbHRlcnMnIG93bnMgb25seSBpdHMgb3duIGdyb3VwczsgdGhlIHJlcG9ydCBiYXIncyBjYWxsc1xuICAvLyByZXNldFRvRGVmYXVsdHMoKS4gRWFjaCBncm91cCBpcyBhbm5vdW5jZWQgYXMgYSB2aWV3ZXIncyBjaGFuZ2UgdG8gaXQgaXMsXG4gIC8vIHNvIHRoZSB0aWxlcyBpbiBpdCByZWZldGNoIGFuZCBhIGJhciBzaG93aW5nIGl0IHdpdGggYW5vdGhlciB2YWx1ZSBpc1xuICAvLyBidWlsdCBhZ2Fpbi5cbiAgcHVibGljIHJlc2V0R3JvdXBzVG9EZWZhdWx0cyhncm91cElkczogcmVhZG9ubHkgbnVtYmVyW10pOiB2b2lkIHtcbiAgICBncm91cElkcy5mb3JFYWNoKChncm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2VlZEF1dGhvcmVkKGdyb3VwKTtcbiAgICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgb25lIG9mIGBncm91cElkc2Agc2hvd3MgYSB2YWx1ZSBvdGhlciB0aGFuIGl0cyBhdXRob3JlZCBkZWZhdWx0LFxuICAvLyB0aGUgdmFsdWUgcmVzZXRHcm91cHNUb0RlZmF1bHRzKCkgcHV0cyBiYWNrLiBBIHRpbGUgaGVhZGVyJ3MgQ2xlYXIgY2hpcFxuICAvLyBzaG93cyBleGFjdGx5IHdoaWxlIG9uZSBvZiBpdHMgb3duIGdyb3VwcyBkb2VzLiBJdCByZWFkcyB0aGUgcmV2aXNpb25cbiAgLy8gZGlmZmVyc0Zyb21EZWZhdWx0cyByZWFkcywgc28gYSBjYWxsZXIgb24gZWFjaCBjaGVjayBvZiBhbiBPblB1c2ggdmlld1xuICAvLyBzdGF5cyBjdXJyZW50LlxuICBwdWJsaWMgZ3JvdXBzRGlmZmVyRnJvbURlZmF1bHRzKGdyb3VwSWRzOiByZWFkb25seSBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3JldmlzaW9uKCk7XG5cbiAgICByZXR1cm4gZ3JvdXBJZHMuc29tZSgoZ3JvdXBJZCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhvcmVkID0gdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCkpO1xuICAgICAgY29uc3Qgc2NyZWVuID0gdGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXBJZCkgPyBudWxsIDogdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCkpO1xuXG4gICAgICByZXR1cm4gIXNhbWVTdG9yZWRHcm91cFZhbHVlKGF1dGhvcmVkLCBzY3JlZW4pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGludGVyYWN0aW9uIHN0YXRlIGEgdGlsZSdzIGRhdGEgcmVxdWVzdCBjYXJyaWVzIG5vdzogdGlsZURhdGFTdGF0ZVxuICAvLyBvdmVyIHRoZSBvcGVuIHJlcG9ydCBhbmQgdGhlIHNjcmVlbidzIHNuYXBzaG90KCkuXG4gIHB1YmxpYyB0aWxlU3RhdGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBDb21wb25lbnREYXRhU3RhdGUge1xuICAgIHJldHVybiB0aWxlRGF0YVN0YXRlKHRoaXMuX3JlcG9ydCgpLCBjb21wb25lbnQsIHRoaXMuc25hcHNob3QoKSk7XG4gIH1cblxuICAvLyBUaGUgcmVsYXRpdmUgcmFuZ2UgYSBncm91cCdzIHZhbHVlIHN0aWxsIGlzLCBhcyBhIGRhdGEgcmVxdWVzdCBuYW1lcyBpdFxuICAvLyAoaXRzIHByZXNldCB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSksIG9yIG51bGwuIFRoZVxuICAvLyBleHBvcnQgd29yZGluZyBuYW1lcyBhIGxpdmUgcHJlc2V0IGJ5IGl0LlxuICBwdWJsaWMgbGl2ZVByZXNldChncm91cElkOiBudW1iZXIpOiBSZXBvcnRSZWxhdGl2ZVJhbmdlIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpO1xuXG4gICAgcmV0dXJuIHZhbHVlID8gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSkgOiBudWxsO1xuICB9XG5cbiAgLy8gQSBncm91cCB2YWx1ZSBhcyB0aGUgZmllbGRzIGEgcmVxdWVzdCBjYXJyaWVzOiBkYXRlIGJvdW5kcyBhcyBjYWxlbmRhclxuICAvLyBkYXlzLCBzZWxlY3QgdmFsdWVzIHdoZW4gYW55IGFyZSBwaWNrZWQgKGVsc2UgdGhlIHZhbHVlcyBsZWZ0IG91dCksXG4gIC8vIGtleXdvcmQgdGV4dCB0cmltbWVkLCBhIG51bWJlciByYW5nZSdzIGVuZHMuIE51bGwgd2hlbiBhbGwgb2YgdGhlbSBhcmVcbiAgLy8gZW1wdHkuIEEgZGF0ZSByYW5nZSBhbHNvIG5hbWVzIHRoZSByZWxhdGl2ZSByYW5nZSBpdCBzdGlsbCBpc1xuICAvLyAoX2xpdmVQcmVzZXQpLCBzbyB0aGUgc2VydmVyIGtub3dzIHdoaWNoIHBlcmlvZCB0aGUgZGF5cyBjb3ZlcjtcbiAgLy8gdGhlIGRheXMgc3RheSB0aGUgd2luZG93IGVpdGhlciB3YXkuIENvbXBvbmVudCBkYXRhLCB0aGUgcmVwb3J0IGFuZCBwYWdlXG4gIC8vIGV4cG9ydHMgYW5kIHRoZSBjaGF0J3Mgdmlld2VyIGZpbHRlcnMgYWxsIHJlYWQgdGhlaXIgZmllbGRzIGhlcmUsIHNvIGFsbFxuICAvLyB0aHJlZSBjYXJyeSBpdC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHByZXNldCkge1xuICAgICAgZmllbGRzLnByZXNldCA9IHByZXNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc29sdmVFeGNsdWRlQW5kUmFuZ2UodmFsdWUsIGZpZWxkcyk7XG5cbiAgICByZXR1cm4gZmllbGRzLnN0YXJ0IHx8IGZpZWxkcy5lbmQgfHwgZmllbGRzLnZhbHVlcyB8fCBmaWVsZHMudmFsdWVcbiAgICAgIHx8IGZpZWxkcy5leGNsdWRlVmFsdWVzIHx8IGZpZWxkcy5taW4gIT09IHVuZGVmaW5lZCB8fCBmaWVsZHMubWF4ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZmllbGRzXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBUaGUgcmVsYXRpdmUgcmFuZ2UgYSBkYXRlIHZhbHVlIHN0aWxsIGlzOiB0aGUgcHJlc2V0IG5hbWUgaXQgY2FycmllcyxcbiAgLy8gd2hpbGUgaXRzIGRheXMgYXJlIHRoYXQgcmFuZ2UgcmVzb2x2ZWQgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUuIEFcbiAgLy8gdmFsdWUgd2hvc2UgZGF5cyB0aGUgdmlld2VyIGNoYW5nZWQsIG9yIG9uZSBzZWVkZWQgYmVmb3JlIG1pZG5pZ2h0IHRoYXRcbiAgLy8gaXMgbm93IGEgZGF5IGJlaGluZCwgbmFtZXMgbm9uZSwgYW5kIHRoZSBzZXJ2ZXIgcmVhZHMgaXRzIGRheXMgYWxvbmUuXG4gIHByaXZhdGUgX2xpdmVQcmVzZXQodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBSZXBvcnRSZWxhdGl2ZVJhbmdlIHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZS5wcmVzZXQgfHwgIWlzUmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZSA9IHRoaXMuX3JlbGF0aXZlUmFuZ2UodmFsdWUucHJlc2V0KTtcblxuICAgIHJldHVybiByYW5nZSAmJiBzYW1lRGF5cyh2YWx1ZSwgcmFuZ2UpID8gdmFsdWUucHJlc2V0IDogbnVsbDtcbiAgfVxuXG4gIC8vIFNlZWRzIG9uZSBncm91cCBvbiAocmUpbG9hZDsgc2VlIGluaXQoKS4gYHByZXZpb3VzYCBpcyB0aGUgZ3JvdXAgYXMgdGhlXG4gIC8vIGxhc3QgbG9hZCBoYWQgaXQsIG9yIG51bGwgd2hlbiBpdCBpcyBuZXcuXG4gIHByaXZhdGUgX3NlZWQoXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHByZXZpb3VzOiBSZXBvcnRGaWx0ZXJHcm91cCB8IG51bGwsXG4gICAgdGltZXpvbmVDaGFuZ2VkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0Q2hhbmdlZCA9ICFzYW1lRGVmYXVsdChwcmV2aW91cz8uY29uZmlnPy5kZWZhdWx0ID8/IG51bGwsIGdyb3VwLmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsKTtcblxuICAgIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuICAgIGNvbnN0IHByZXNldFRvUmVzb2x2ZSA9IHRpbWV6b25lQ2hhbmdlZFxuICAgICAgJiYgISF2YWx1ZT8ucHJlc2V0XG4gICAgICAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmU7XG5cbiAgICBpZiAodmFsdWUgJiYgIWRlZmF1bHRDaGFuZ2VkICYmICFwcmVzZXRUb1Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgZGVmYXVsdFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGUgZGVmYXVsdCB3YXMgY2xlYXJlZCwgc28gdGhlIHZhbHVlIGl0IHNlZWRlZCBnb2VzIHdpdGggaXQuXG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFZhbHVlcyBpbmNsdWRlZDogb25lIGlzIG5ldmVyIGRyYXduLCBidXQgaXRzIGZpbHRlcnMgYXJlIHRoZSByZXBvcnQnc1xuICAgIC8vIGxpa2UgYW55IG90aGVyIGNvbXBvbmVudCdzLCBhbmQgc28gYXJlIHRoZWlyIHNlc3Npb24gdG9nZ2xlcy5cbiAgICBjb25zdCBmaWx0ZXJJZHMgPSBuZXcgU2V0KHJlcG9ydENvbXBvbmVudHMocmVwb3J0KVxuICAgICAgLmZsYXRNYXAoKGNvbXBvbmVudCkgPT4gKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmlkKSkpO1xuXG4gICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmZvckVhY2goKGZpbHRlcklkKSA9PiB7XG4gICAgICBpZiAoIWZpbHRlcklkcy5oYXMoZmlsdGVySWQpKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgY29uc3QgaGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPigpO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuKCkuZm9yRWFjaCgobmFtZXMsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBrZXB0ID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBuYW1lcyk7XG5cbiAgICAgIGlmIChrZXB0Lmxlbmd0aCkge1xuICAgICAgICBoaWRkZW4uc2V0KGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQoaGlkZGVuKTtcbiAgfVxuXG4gIC8vIFRoZSB2YWx1ZSBhIGJhciBzZXRzLCBrZWVwaW5nIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgd2hpbGUgdGhlIGRheXMgYXJlXG4gIC8vIHN0aWxsIHRoZSBzdG9yZWQgZGF5cyAoc2VlIHNldFZhbHVlKS5cbiAgcHJpdmF0ZSBfd2l0aFByZXNldChzdG9yZWQ6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogRmlsdGVyR3JvdXBWYWx1ZSB7XG4gICAgY29uc3QgZml4ZWQ6IEZpbHRlckdyb3VwVmFsdWUgPSB7IC4uLnZhbHVlIH07XG4gICAgZGVsZXRlIGZpeGVkLnByZXNldDtcblxuICAgIHJldHVybiBzdG9yZWQ/LnByZXNldCAmJiBzYW1lRGF5cyhzdG9yZWQsIGZpeGVkKVxuICAgICAgPyB7IC4uLmZpeGVkLCBwcmVzZXQ6IHN0b3JlZC5wcmVzZXQgfVxuICAgICAgOiBmaXhlZDtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RDb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiByZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jyk7XG4gIH1cblxuICAvLyBUaGUgY29sdW1ucyBhIGxpc3QgY2FuIGJlIHNvcnRlZCBieTogZXZlcnkgYXV0aG9yZWQgY29sdW1uLCBvciBhXG4gIC8vIGNyb3NzLXRhYidzIHJvdyBjb2x1bW4gb25seSAoaXRzIHBpdm90IGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YSkuXG4gIHByaXZhdGUgX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnO1xuXG4gICAgaWYgKGNvbmZpZz8ucGl2b3RCeT8uY29sdW1uKSB7XG4gICAgICByZXR1cm4gY29uZmlnLnJvd0J5Py5jb2x1bW4gPyBbY29uZmlnLnJvd0J5LmNvbHVtbl0gOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNvbmZpZz8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+IGNvbHVtbi5jb2x1bW4pO1xuICB9XG5cbiAgLy8gQSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIG1hcHBlZCB0byBhIHNlc3Npb24gdmFsdWUgYnkgdHlwZS4gUmVsYXRpdmVcbiAgLy8gZGF0ZSBwcmVzZXRzIHJlc29sdmUgYWdhaW5zdCBcIm5vd1wiIGVhY2ggdGltZSB0aGUgcmVwb3J0IG9wZW5zLCBzbyBhIHNhdmVkXG4gIC8vIFwibGFzdCAxMiBtb250aHNcIiBzdGF5cyByZWxhdGl2ZSBhbmQgY2FycmllcyBpdHMgcHJlc2V0IG5hbWU7IGEgZml4ZWRcbiAgLy8gcmFuZ2UsIHNlbGVjdCB2YWx1ZXMgYW5kIGtleXdvcmQgdGV4dCBzZWVkIHZlcmJhdGltLlxuICBwcml2YXRlIF9kZWZhdWx0VmFsdWUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSk7XG5cbiAgICAgIHJldHVybiByYW5nZSA/IHsgc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCwgcHJlc2V0OiBncm91cERlZmF1bHQucmVsYXRpdmUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGdyb3VwRGVmYXVsdC52YWx1ZXMgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogZ3JvdXBEZWZhdWx0LnZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVPclJhbmdlRGVmYXVsdChncm91cERlZmF1bHQpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgZ3JvdXAgaW4gaXRzIHN0b3JlZCBzaGFwZTogbnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgZGVmYXVsdFxuICAvLyB0aGUgdmlld2VyIGNsZWFyZWQgaW5jbHVkZWQuXG4gIHByaXZhdGUgX3NuYXBzaG90R3JvdXBzKCk6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+ID0ge307XG5cbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGdyb3Vwc1tncm91cC5pZF0gPSB0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZClcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICAvLyBFYWNoIHRpbGUncyBzdGF0ZSB3aGVyZSBpdCBkaWZmZXJzIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgbGlzdCBzb3J0XG4gIC8vIHRoYXQgaXMgdGhlIGxpc3QncyBhdXRob3JlZCBmaXJzdCB0ZXJtIGlzIGl0cyBkZWZhdWx0LCBub3QgYSBjaG9pY2UuXG4gIHByaXZhdGUgX3NuYXBzaG90VGlsZXMoKTogUmVjb3JkPG51bWJlciwgUmVwb3J0VGlsZVN0YXRlPiB7XG4gICAgY29uc3QgdGlsZXM6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuX3RpbGVzKCkpIHtcbiAgICAgIGNvbnN0IHRpbGU6IFJlcG9ydFRpbGVTdGF0ZSA9IHt9O1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3QgZHJpbGwgPSB0aGlzLmRyaWxsKGNvbXBvbmVudC5pZCk7XG5cbiAgICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICAgIHRpbGUuc29ydCA9IHsgLi4uc29ydCB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICB0aWxlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICAgIH1cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuaGlkZGVuID0gWy4uLmhpZGRlbl07XG4gICAgICB9XG4gICAgICBpZiAoZHJpbGwubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZHJpbGwgPSBkcmlsbC5tYXAoKHN0ZXApID0+ICh7IC4uLnN0ZXAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGlsZSkubGVuZ3RoKSB7XG4gICAgICAgIHRpbGVzW2NvbXBvbmVudC5pZF0gPSB0aWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aWxlcztcbiAgfVxuXG4gIC8vIEEgZ3JvdXAgYmFjayBhdCBpdHMgYXV0aG9yZWQgZGVmYXVsdC5cbiAgcHJpdmF0ZSBfc2VlZEF1dGhvcmVkKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcblxuICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwLmlkKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVyeSB0aWxlIGJhY2sgYXQgaXRzIGF1dGhvcmVkIHN0YXRlLlxuICBwcml2YXRlIF9jbGVhclRpbGVzKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTb3J0cy5jbGVhcigpO1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5jbGVhcigpO1xuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV3IE1hcCgpKTtcbiAgICB0aGlzLl9kcmlsbHMuc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5fZ3JpZExheW91dHMuc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzLnNldChuZXcgTWFwKCkpO1xuICB9XG5cbiAgLy8gc2V0R3JpZExheW91dCgpIHdpdGhvdXQgdGhlIGNoYW5nZSBldmVudDsgdHJ1ZSB3aGVuIHRoZSBsYXlvdXQgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfcHV0R3JpZExheW91dChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgbGF5b3V0OiBHcmlkTGF5b3V0KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmFzZSA9IGdyaWRMYXlvdXRLZXkoYXV0aG9yZWRHcmlkTGF5b3V0KGNvbXBvbmVudCkpO1xuICAgIGNvbnN0IGtleSA9IGdyaWRMYXlvdXRLZXkobGF5b3V0KTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ3JpZExheW91dHMoKS5nZXQoY29tcG9uZW50LmlkKTtcbiAgICBjb25zdCB1bmNoYW5nZWQgPSBrZXkgPT09IGJhc2VcbiAgICAgID8gIWN1cnJlbnRcbiAgICAgIDogY3VycmVudD8uYmFzZSA9PT0gYmFzZSAmJiBncmlkTGF5b3V0S2V5KGN1cnJlbnQubGF5b3V0KSA9PT0ga2V5O1xuXG4gICAgaWYgKGNvbXBvbmVudC50eXBlICE9PSAnZ3JpZCcgfHwgdW5jaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5fZ3JpZExheW91dHMoKSk7XG5cbiAgICBpZiAoa2V5ID09PSBiYXNlKSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnQuaWQsIHsgbGF5b3V0LCBiYXNlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2dyaWRMYXlvdXRzLnNldChuZXh0KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gRXZlcnkgdGFibGUgdGhhdCBmb2xsb3dzIHRoZSBncm91cC1ieSAoZm9sbG93c0dyb3VwQnkpLCBpdHMgY29sdW1uIGZpbHRlclxuICAvLyBvbiB0aGUgZ3JvdXAtYnkncyBmaWVsZCBtb3ZlZCB0byB0aGUgZ3JhaW4gaXQgbm93IHJlYWRzIGF0OiB0aGUgdmlld2VyJ3NcbiAgLy8gcGljaywgZWxzZSB0aGUgdGFibGUncyBvd24gKGdyYWluZWRHcmlkTGF5b3V0KCkpLiBUYWJsZXMgb24gb3RoZXIgcGFnZXNcbiAgLy8gbW92ZSB0b28sIHNvIHRoZWlyIGZpbGVzLCB0aGUgY2hhdCBhbmQgdGhlaXIgbmV4dCBwYWludCByZWFkIHRoZSBtb3ZlZFxuICAvLyBmaWx0ZXIuIEEgZmlsdGVyIHRha2VuIG91dCBpcyBub3RlZCBvbiBpdHMgdGlsZSAoZ3JpZENsZWFyZWRGaWx0ZXIoKSk7IGFcbiAgLy8gbm90ZSBhbHJlYWR5IHRoZXJlIG5hbWVzIHRoZSBuZXcgZ3JhaW4sIHVubGVzcyB0aGUgZmllbGQgaXMgZmlsdGVyZWRcbiAgLy8gYWdhaW4sIHdoaWNoIGVuZHMgaXQuXG4gIHByaXZhdGUgX2dyYWluR3JpZExheW91dHMoKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJlZCA9IG5ldyBNYXAodGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzKCkpO1xuXG4gICAgdGhpcy5fdGlsZXMoKS5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwQnkgPSBjb21wb25lbnQudHlwZSA9PT0gJ2dyaWQnID8gY29tcG9uZW50LmZvbGxvd3NHcm91cEJ5IDogbnVsbDtcbiAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5fZnJlcXVlbmN5ID8/IGdyb3VwQnk/LmdyYW51bGFyaXR5O1xuICAgICAgaWYgKCFncm91cEJ5IHx8ICFncmFudWxhcml0eSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyYWluZWQgPSBncmFpbmVkR3JpZExheW91dCh0aGlzLmdyaWRMYXlvdXQoY29tcG9uZW50KSwgZ3JvdXBCeS5maWVsZCwgZ3JhbnVsYXJpdHkpO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSAoZ3JhaW5lZC5sYXlvdXQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiBmaWx0ZXIuZmllbGQgPT09IGdyb3VwQnkuZmllbGQpO1xuICAgICAgY29uc3Qgbm90ZSA9IGdyYWluZWQuY2xlYXJlZCA/PyAoZmlsdGVyZWQgPyBudWxsIDogY2xlYXJlZC5nZXQoY29tcG9uZW50LmlkKSk7XG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBjbGVhcmVkLnNldChjb21wb25lbnQuaWQsIHsgLi4ubm90ZSwgZ3JhbnVsYXJpdHk6IEdSSURfR1JBTlVMQVJJVElFU1tncmFudWxhcml0eV0gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhcmVkLmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9wdXRHcmlkTGF5b3V0KGNvbXBvbmVudCwgZ3JhaW5lZC5sYXlvdXQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzLnNldChjbGVhcmVkKTtcbiAgfVxuXG4gIC8vIE9uZSBjaGFydCdzIGRyaWxsIHBhdGg7IGFuIGVtcHR5IHBhdGggaXMgdGhlIGNoYXJ0J3MgdG9wLlxuICBwcml2YXRlIF9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQ6IG51bWJlciwgcGF0aDogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLl9kcmlsbHMoKSk7XG5cbiAgICBpZiAocGF0aC5sZW5ndGgpIHtcbiAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyaWxscy5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBBZnRlciByZXNldFRvRGVmYXVsdHMoKTogZXZlcnkgYmFyIGFuZCB0aWxlIHJlcGFpbnRzLCBhbmQgdGhlIHRpbGVzIHRoYXRcbiAgLy8gZm9sbG93IHRoZSBncm91cC1ieSByZWZldGNoIHdoZW4gdGhlIGdyYWluIG1vdmVkLlxuICBwcml2YXRlIF9ub3RpZnlSZXNldChmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGVWZXJzaW9uLnVwZGF0ZSgodmVyc2lvbikgPT4gdmVyc2lvbiArIDEpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG5cbiAgICBpZiAoZnJlcXVlbmN5ICE9PSB0aGlzLl9mcmVxdWVuY3kpIHtcbiAgICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSB0aWxlcyBvZiB0aGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQuXG4gIHByaXZhdGUgX3RpbGVzKCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9yZXBvcnQoKTtcblxuICAgIHJldHVybiByZXBvcnRcbiAgICAgID8gcmVwb3J0Q29tcG9uZW50cyhyZXBvcnQpLmZpbHRlcihpc1RpbGUpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNDaGFydChjb21wb25lbnRJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbGVzKClcbiAgICAgIC5zb21lKChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCA9PT0gY29tcG9uZW50SWQgJiYgY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcpO1xuICB9XG5cbiAgLy8gRHJvcHMgZWFjaCB0YWJsZSBsYXlvdXQgYW5kIGV4cGFuc2lvbiB3aG9zZSB0aWxlIGlzIGdvbmUgb3IgaXMgbm8gdGFibGVcbiAgLy8gYW55IG1vcmUuIEEgbGF5b3V0IHdob3NlIHRpbGUgaXMgbm93IGF1dGhvcmVkIG90aGVyd2lzZSAoYW4gZWRpdCwgdGhlXG4gIC8vIGFnZW50J3MpIG1vdmVzIG9udG8gdGhlIG5ldyBhdXRob3JlZCBsYXlvdXQsIGtlZXBpbmcgdGhlIHZpZXdlcidzIGZpbHRlcnNcbiAgLy8gYW5kIHNvcnQgdGVybXMgb24gZmllbGRzIGl0IHN0aWxsIHBsYWNlcyAocmViYXNlZEdyaWRMYXlvdXQpLCBzbyB0aGUgdGlsZVxuICAvLyBzaG93cyBib3RoIGNoYW5nZXM7IG9uZSB0aGF0IHRoZW4gZHJhd3MgdGhlIGF1dGhvcmVkIGxheW91dCBpcyBkcm9wcGVkLlxuICBwcml2YXRlIF9wcnVuZUdyaWRMYXlvdXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyaWRzID0gbmV3IE1hcCh0aGlzLl90aWxlcygpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnZ3JpZCcpXG4gICAgICAubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcbiAgICBjb25zdCBrZXB0ID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEdyaWRTZXNzaW9uTGF5b3V0PigpO1xuXG4gICAgdGhpcy5fZ3JpZExheW91dHMoKS5mb3JFYWNoKChzZXNzaW9uLCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JpZHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aG9yZWQgPSBhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KTtcbiAgICAgIGNvbnN0IGJhc2UgPSBncmlkTGF5b3V0S2V5KGF1dGhvcmVkKTtcbiAgICAgIGNvbnN0IGxheW91dCA9IHNlc3Npb24uYmFzZSA9PT0gYmFzZSA/IHNlc3Npb24ubGF5b3V0IDogcmViYXNlZEdyaWRMYXlvdXQoc2Vzc2lvbi5sYXlvdXQsIHNlc3Npb24uYmFzZSwgYXV0aG9yZWQpO1xuXG4gICAgICBpZiAoZ3JpZExheW91dEtleShsYXlvdXQpICE9PSBiYXNlKSB7XG4gICAgICAgIGtlcHQuc2V0KGNvbXBvbmVudElkLCB7IGxheW91dCwgYmFzZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2dyaWRMYXlvdXRzLnNldChrZXB0KTtcbiAgICB0aGlzLl9ncmlkRXhwYW5zaW9ucy5zZXQobmV3IE1hcChbLi4udGhpcy5fZ3JpZEV4cGFuc2lvbnMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IGdyaWRzLmhhcyhjb21wb25lbnRJZCkpKSk7XG4gICAgdGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzLnNldChuZXcgTWFwKFsuLi50aGlzLl9ncmlkQ2xlYXJlZEZpbHRlcnMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IGdyaWRzLmhhcyhjb21wb25lbnRJZCkpKSk7XG4gIH1cblxuICAvLyBLZWVwcyB0aGUgcGFnZSwgZHJpbGwgYW5kIHRhYmxlIHN0YXRlIHRvIHdoYXQgdGhlIHJlcG9ydCAocmUpbG9hZGVkIGJ5XG4gIC8vIGluaXQoKSBzdGlsbCBoYXM6IGRyaWxsIHBhdGhzIG9uIGNoYXJ0cyBpdCBzdGlsbCBoYXMsIHRoZSBwYWdlIHdoaWxlIGl0XG4gIC8vIGhhcyBpdCwgYW5kIGVhY2ggdGFibGUncyBsYXlvdXQgYW5kIG9wZW4gZ3JvdXBzIHdoaWxlIGl0IGlzIHN0aWxsIGEgdGFibGVcbiAgLy8gKF9wcnVuZUdyaWRMYXlvdXRzKS4gT24gYW5vdGhlciByZXBvcnQgaXQgc3RhcnRzIGFnYWluOiBtYXRjaCAnYWxsJywgbm9cbiAgLy8gZHJpbGwsIGV2ZXJ5IHRhYmxlIGFzIGF1dGhvcmVkIGFuZCBjbG9zZWQsIGFuZCBub3RoaW5nIHRlbXBvcmFyeS5cbiAgcHJpdmF0ZSBfcHJ1bmVQYWdlU3RhdGUocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVwb3J0KCk/LmlkICE9PSByZXBvcnQuaWQpIHtcbiAgICAgIHRoaXMuX21hdGNoLnNldCgnYWxsJyk7XG4gICAgICB0aGlzLl9wYWdlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKCkpO1xuICAgICAgdGhpcy5fZ3JpZExheW91dHMuc2V0KG5ldyBNYXAoKSk7XG4gICAgICB0aGlzLl9ncmlkRXhwYW5zaW9ucy5zZXQobmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuX2dyaWRDbGVhcmVkRmlsdGVycy5zZXQobmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuX3RlbXBvcmFyeS5zZXQoZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKFsuLi50aGlzLl9kcmlsbHMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IHRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpKSkpO1xuICAgIHRoaXMuX3BydW5lR3JpZExheW91dHMoKTtcbiAgICAvLyBBIHRhYmxlIHRoZSByZXBvcnQgbm93IGF1dGhvcnMgb3RoZXJ3aXNlIHJlYWRzIGF0IHRoZSBncmFpbiBvbiBzY3JlZW4uXG4gICAgdGhpcy5fZ3JhaW5HcmlkTGF5b3V0cygpO1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpICYmICEocmVwb3J0LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiBwYWdlLmlkID09PSB0aGlzLl9wYWdlSWQoKSkpIHtcbiAgICAgIHRoaXMuX3BhZ2VJZC5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBzZWxlY3QncyB2YWx1ZXMgdG8gbGVhdmUgb3V0IChvbmx5IHdoZW4gaXQga2VlcHMgbm9uZSkgYW5kIGEgbnVtYmVyXG4gIC8vIHJhbmdlJ3MgZW5kcywgYW4gb3BlbiBlbmQgbGVmdCBvdXQgYW5kIDAga2VwdCwgd3JpdHRlbiBvbnRvIGBmaWVsZHNgLlxuICBwcml2YXRlIF9yZXNvbHZlRXhjbHVkZUFuZFJhbmdlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlLCBmaWVsZHM6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuZXhjbHVkZVZhbHVlcz8ubGVuZ3RoICYmICFmaWVsZHMudmFsdWVzKSB7XG4gICAgICBmaWVsZHMuZXhjbHVkZVZhbHVlcyA9IHZhbHVlLmV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgY29uc3QgbWluID0gZmluaXRlTnVtYmVyKHZhbHVlLm1pbik7XG4gICAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKHZhbHVlLm1heCk7XG5cbiAgICBpZiAobWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkcy5taW4gPSBtaW47XG4gICAgfVxuICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRzLm1heCA9IG1heDtcbiAgICB9XG4gIH1cblxuICAvLyBBbiBhdXRob3JlZCBkZWZhdWx0IHRoYXQgbGVhdmVzIHNlbGVjdCB2YWx1ZXMgb3V0LCBvciBhIG51bWJlciByYW5nZSdzXG4gIC8vIGVuZHMgKDAga2VwdCksIGFzIGEgc2Vzc2lvbiB2YWx1ZTsgbnVsbCB3aGVuIGl0IGhvbGRzIG5laXRoZXIuXG4gIHByaXZhdGUgX2V4Y2x1ZGVPclJhbmdlRGVmYXVsdChncm91cERlZmF1bHQ6IEZpbHRlckdyb3VwRGVmYXVsdCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBpZiAoZ3JvdXBEZWZhdWx0LmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgZXhjbHVkZVZhbHVlczogZ3JvdXBEZWZhdWx0LmV4Y2x1ZGVWYWx1ZXMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW4gPSBmaW5pdGVOdW1iZXIoZ3JvdXBEZWZhdWx0Lm1pbik7XG4gICAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKGdyb3VwRGVmYXVsdC5tYXgpO1xuXG4gICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkICYmIG1heCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uKG1pbiAhPT0gdW5kZWZpbmVkID8geyBtaW4gfSA6IHt9KSxcbiAgICAgIC4uLihtYXggIT09IHVuZGVmaW5lZCA/IHsgbWF4IH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIENvdW50cyBhIHJlc2V0IGZvciBlYWNoIGxpc3Qgd2hvc2Ugc29ydCBpcyBub3QgdGhlIG9uZSBpdCBoYWQgKGBiZWZvcmVgLFxuICAvLyB0aGUgc29ydHMgYnkgbGlzdCBiZWZvcmUgdGhlIHJlc2V0KS4gQSBzb3J0IGEgbGlzdCBsb3N0IGFuZCBvbmUgaXRcbiAgLy8gZ2FpbmVkIGJvdGggY291bnQ7IHRoZSBhdXRob3JlZCBzb3J0IGlzIG5vIGVudHJ5IGVpdGhlciBzaWRlLlxuICBwcml2YXRlIF9jb3VudFNvcnRSZXNldHMoYmVmb3JlOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KTogdm9pZCB7XG4gICAgY29uc3QgbW92ZWQgPSBbLi4ubmV3IFNldChbLi4uYmVmb3JlLmtleXMoKSwgLi4udGhpcy5fbGlzdFNvcnRzLmtleXMoKV0pXVxuICAgICAgLmZpbHRlcigoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgY29uc3Qgd2FzID0gYmVmb3JlLmdldChjb21wb25lbnRJZCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHdhcyA/ICFzYW1lU29ydCh3YXMsIG5vdykgOiBub3cgIT09IG51bGw7XG4gICAgICB9KTtcblxuICAgIGlmICghbW92ZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRzID0gbmV3IE1hcCh0aGlzLl9saXN0U29ydFJlc2V0cygpKTtcbiAgICBtb3ZlZC5mb3JFYWNoKChjb21wb25lbnRJZCkgPT4gY291bnRzLnNldChjb21wb25lbnRJZCwgKGNvdW50cy5nZXQoY29tcG9uZW50SWQpID8/IDApICsgMSkpO1xuICAgIHRoaXMuX2xpc3RTb3J0UmVzZXRzLnNldChjb3VudHMpO1xuICB9XG59XG4iXX0=