mtrl-addons 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -38,8 +38,13 @@ __export(exports_src, {
38
38
  createVList: () => createVList,
39
39
  createLayout: () => createLayout,
40
40
  createGestureManager: () => createGestureManager,
41
+ createForm: () => createForm,
41
42
  cleanupLayoutClasses: () => cleanupLayoutClasses,
42
- applyLayoutClasses: () => applyLayoutClasses
43
+ applyLayoutClasses: () => applyLayoutClasses,
44
+ FORM_EVENTS: () => FORM_EVENTS,
45
+ FORM_DEFAULTS: () => FORM_DEFAULTS,
46
+ FORM_CLASSES: () => FORM_CLASSES,
47
+ DATA_STATE: () => DATA_STATE
43
48
  });
44
49
  module.exports = __toCommonJS(exports_src);
45
50
 
@@ -5138,6 +5143,810 @@ var createVList = (config = {}) => {
5138
5143
  throw error;
5139
5144
  }
5140
5145
  };
5146
+ // src/components/form/form.ts
5147
+ var import_mtrl13 = require("mtrl");
5148
+ var import_mtrl14 = require("mtrl");
5149
+ var import_mtrl15 = require("mtrl");
5141
5150
 
5142
- //# debugId=5BDF78280285257764756E2164756E21
5143
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3V0aWxzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IEdlc3R1cmVFdmVudCwgR2VzdHVyZVN0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIERpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2UoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coeDIgLSB4MSwgMikgKyBNYXRoLnBvdyh5MiAtIHkxLCAyKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGFuZ2xlIGJldHdlZW4gdHdvIHBvaW50cyBpbiBkZWdyZWVzICgwLTM2MClcbiAqXG4gKiBAcGFyYW0geDEgLSBYIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB5MSAtIFkgY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHgyIC0gWCBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHBhcmFtIHkyIC0gWSBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHJldHVybnMgQW5nbGUgaW4gZGVncmVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5nbGUoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGFuZ2xlID0gKE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSkgKiAxODApIC8gTWF0aC5QSTtcbiAgcmV0dXJuIGFuZ2xlIDwgMCA/IGFuZ2xlICsgMzYwIDogYW5nbGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFzZSBnZXN0dXJlIGV2ZW50XG4gKlxuICogQHBhcmFtIHR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAqIEBwYXJhbSBvcmlnaW5hbEV2ZW50IC0gT3JpZ2luYWwgRE9NIGV2ZW50XG4gKiBAcGFyYW0gc3RhdGUgLSBDdXJyZW50IGdlc3R1cmUgc3RhdGVcbiAqIEByZXR1cm5zIEJhc2UgZ2VzdHVyZSBldmVudCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdlc3R1cmVFdmVudChcbiAgdHlwZTogc3RyaW5nLFxuICBvcmlnaW5hbEV2ZW50OiBFdmVudCxcbiAgc3RhdGU6IEdlc3R1cmVTdGF0ZVxuKTogR2VzdHVyZUV2ZW50IHtcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG5cbiAgY29uc3QgZXZlbnQ6IEdlc3R1cmVFdmVudCA9IHtcbiAgICB0eXBlLFxuICAgIG9yaWdpbmFsRXZlbnQsXG4gICAgdGFyZ2V0OlxuICAgICAgKHN0YXRlLnRhcmdldCBhcyBFdmVudFRhcmdldCkgfHwgKG9yaWdpbmFsRXZlbnQudGFyZ2V0IGFzIEV2ZW50VGFyZ2V0KSxcbiAgICBzdGFydFRpbWU6IHN0YXRlLnN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uOiBlbmRUaW1lIC0gc3RhdGUuc3RhcnRUaW1lLFxuICAgIGRlZmF1bHRQcmV2ZW50ZWQsXG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICBpZiAob3JpZ2luYWxFdmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgb3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0b3VjaCBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRvdWNoIGlzIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVG91Y2hTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhQb2ludHMgPSAobmF2aWdhdG9yIGFzIGFueSkubWF4VG91Y2hQb2ludHM7XG4gIHJldHVybiAoXG4gICAgXCJvbnRvdWNoc3RhcnRcIiBpbiB3aW5kb3cgfHwgKHR5cGVvZiBtYXhQb2ludHMgPT09IFwibnVtYmVyXCIgJiYgbWF4UG9pbnRzID4gMClcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgcG9pbnRlciBldmVudHMgYXJlIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9pbnRlclN1cHBvcnQoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXdpbmRvdy5Qb2ludGVyRXZlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCBub3JtYWxpemVkIHRvdWNoIGNvb3JkaW5hdGVzIGZyb20gYW4gZXZlbnRcbiAqIFdvcmtzIHdpdGggbW91c2UgZXZlbnRzLCB0b3VjaCBldmVudHMgYW5kIHBvaW50ZXIgZXZlbnRzXG4gKlxuICogQHBhcmFtIGUgLSBET00gZXZlbnRcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNsaWVudFggYW5kIGNsaWVudFkgY29vcmRpbmF0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvdWNoQ29vcmRpbmF0ZXMoXG4gIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgUG9pbnRlckV2ZW50XG4pOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0ge1xuICBpZiAoXCJ0b3VjaGVzXCIgaW4gZSAmJiBBcnJheS5pc0FycmF5KGUudG91Y2hlcykgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50WDogZS50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBlLnRvdWNoZXNbMF0uY2xpZW50WSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbGllbnRYOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRYLFxuICAgIGNsaWVudFk6IChlIGFzIE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpLmNsaWVudFksXG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBUYXAgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCB0YXAgZ2VzdHVyZVxuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRhcCBldmVudCBvciBudWxsIGlmIG5vIHRhcCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0VGFwKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogVGFwRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBjdXJyZW50IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgaWYgKGRpc3RhbmNlIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCkge1xuICAgIC8vIENoZWNrIGZvciBkb3VibGUgdGFwXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpc0RvdWJsZVRhcCA9IG5vdyAtIHN0YXRlLmxhc3RUYXBUaW1lIDwgMzAwO1xuICAgIFxuICAgIGNvbnN0IHRhcENvdW50ID0gaXNEb3VibGVUYXAgPyBzdGF0ZS50YXBDb3VudCArIDEgOiAxO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0YXAgZXZlbnRcbiAgICBjb25zdCB0YXBFdmVudDogVGFwRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3RhcCcsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6ICd0YXAnLFxuICAgICAgY291bnQ6IHRhcENvdW50LFxuICAgICAgeDogc3RhdGUuY3VycmVudFgsXG4gICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHRhcEV2ZW50O1xuICB9XG4gIFxuICByZXR1cm4gbnVsbDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFN3aXBlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgU3dpcGVFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsIFNXSVBFX0RJUkVDVElPTlMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICogXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKTogU1dJUEVfRElSRUNUSU9OUyB7XG4gIGlmIChNYXRoLmFicyhkZWx0YVgpID4gTWF0aC5hYnMoZGVsdGFZKSkge1xuICAgIHJldHVybiBkZWx0YVggPiAwID8gU1dJUEVfRElSRUNUSU9OUy5SSUdIVCA6IFNXSVBFX0RJUkVDVElPTlMuTEVGVDtcbiAgfVxuICByZXR1cm4gZGVsdGFZID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuRE9XTiA6IFNXSVBFX0RJUkVDVElPTlMuVVA7XG59XG5cbi8qKlxuICogRGV0ZWN0IHN3aXBlIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBTd2lwZSBldmVudCBvciBudWxsIGlmIG5vIHN3aXBlIGRldGVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RTd2lwZShjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFN3aXBlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkZWx0YXMgYW5kIGRpc3RhbmNlXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENhbGN1bGF0ZSB0aW1lIGFuZCB2ZWxvY2l0eVxuICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZGVsdGFUaW1lID0gZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZTtcbiAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGRlbHRhVGltZTtcbiAgXG4gIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICBpZiAoZGlzdGFuY2UgPj0gb3B0aW9ucy5zd2lwZVRocmVzaG9sZCAmJiBkZWx0YVRpbWUgPD0gb3B0aW9ucy5zd2lwZVRpbWVUaHJlc2hvbGQpIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHN3aXBlIGV2ZW50XG4gICAgY29uc3Qgc3dpcGVFdmVudDogU3dpcGVFdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnc3dpcGUnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAnc3dpcGUnLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICB2ZWxvY2l0eSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBlbmRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGVuZFk6IHN0YXRlLmN1cnJlbnRZXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gc3dpcGVFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gTG9uZyBwcmVzcyBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogRGV0ZWN0IGxvbmcgcHJlc3MgZ2VzdHVyZVxuICogXG4gKiBUaGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIG90aGVyIGdlc3R1cmUgZGV0ZWN0b3JzIGFzIGl0IHNldHMgdXAgYSB0aW1lclxuICogYW5kIHJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHRpbWVyIGNvbXBsZXRlcy5cbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbG9uZyBwcmVzcyBpcyBkZXRlY3RlZFxuICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RMb25nUHJlc3MoXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBjYWxsYmFjazogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBTZXQgYSB0aW1lciBmb3IgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gT25seSB0cmlnZ2VyIGlmIGdlc3R1cmUgaXMgc3RpbGwgYWN0aXZlXG4gICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGlmZlggPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WCk7XG4gICAgICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgICAgIFxuICAgICAgaWYgKGRpZmZYIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCAmJiBkaWZmWSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGxvbmcgcHJlc3MgZXZlbnRcbiAgICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnbG9uZ3ByZXNzJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgICAgIHR5cGU6ICdsb25ncHJlc3MnLFxuICAgICAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgICAgIHk6IHN0YXRlLmN1cnJlbnRZXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBUcmlnZ2VyIGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIG9wdGlvbnMubG9uZ1ByZXNzVGltZSk7XG4gIFxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH07XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgbW92ZW1lbnQgd291bGQgY2FuY2VsIGEgbG9uZyBwcmVzc1xuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxvbmcgcHJlc3Mgc2hvdWxkIGJlIGNhbmNlbGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRDYW5jZWxMb25nUHJlc3MoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBib29sZWFuIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgXG4gIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgXG4gIHJldHVybiBkaWZmWCA+IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgfHwgZGlmZlkgPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBhbiBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwYW4gZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgUGFuIGV2ZW50IG9yIG51bGwgaWYgbm8gc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBhbihjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFBhbkV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGRlbHRhIGZyb20gc3RhcnQgcG9zaXRpb25cbiAgY29uc3QgZGVsdGFYID0gc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFg7XG4gIGNvbnN0IGRlbHRhWSA9IHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZO1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIGxhc3QgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlJ3Mgc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAgY29uc3QgbW92ZURlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUubGFzdFg7XG4gIGNvbnN0IG1vdmVEZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLmxhc3RZO1xuICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICApO1xuXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHNpZ25pZmljYW50XG4gIGlmIChtb3ZlRGVsdGEgPiAwKSB7XG4gICAgLy8gQ3JlYXRlIHBhbiBldmVudFxuICAgIGNvbnN0IHBhbkV2ZW50OiBQYW5FdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudChcInBhblwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBhblwiLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgc3RhcnRYOiBzdGF0ZS5zdGFydFgsXG4gICAgICBzdGFydFk6IHN0YXRlLnN0YXJ0WSxcbiAgICAgIGN1cnJlbnRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGN1cnJlbnRZOiBzdGF0ZS5jdXJyZW50WSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhbkV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3BpbmNoLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBpbmNoIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUGluY2hFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50LCBnZXREaXN0YW5jZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGV0ZWN0IHBpbmNoIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUGluY2ggZXZlbnQgb3IgbnVsbCBpZiBubyBwaW5jaCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0UGluY2goXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICB0b3VjaDE6IFRvdWNoLFxuICB0b3VjaDI6IFRvdWNoXG4pOiBQaW5jaEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIG1vdmVtZW50IHRocmVzaG9sZCBmb3IgcGluY2ggZGV0ZWN0aW9uXG4gIGNvbnN0IFBJTkNIX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBkaXN0YW5jZSBjaGFuZ2UgaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKGN1cnJlbnREaXN0YW5jZSAtIHN0YXRlLnN0YXJ0RGlzdGFuY2UpID4gUElOQ0hfVEhSRVNIT0xEKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHNjYWxlIGZhY3RvclxuICAgIGNvbnN0IHNjYWxlID0gY3VycmVudERpc3RhbmNlIC8gc3RhdGUuc3RhcnREaXN0YW5jZTtcblxuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSBwaW5jaCBldmVudFxuICAgIGNvbnN0IHBpbmNoRXZlbnQ6IFBpbmNoRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwaW5jaFwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBpbmNoXCIsXG4gICAgICBzY2FsZSxcbiAgICAgIGNlbnRlclgsXG4gICAgICBjZW50ZXJZLFxuICAgIH07XG5cbiAgICByZXR1cm4gcGluY2hFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9yb3RhdGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gUm90YXRlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUm90YXRlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0QW5nbGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCByb3RhdGUgZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIHRvdWNoMSAtIEZpcnN0IHRvdWNoIHBvaW50XG4gKiBAcGFyYW0gdG91Y2gyIC0gU2Vjb25kIHRvdWNoIHBvaW50XG4gKiBAcmV0dXJucyBSb3RhdGUgZXZlbnQgb3IgbnVsbCBpZiBubyByb3RhdGlvbiBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Um90YXRlKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUm90YXRlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcblxuICAvLyBDYWxjdWxhdGUgY3VycmVudCBhbmdsZSBiZXR3ZWVuIHRvdWNoIHBvaW50c1xuICBjb25zdCBjdXJyZW50QW5nbGUgPSBnZXRBbmdsZShcbiAgICB0b3VjaDEuY2xpZW50WCxcbiAgICB0b3VjaDEuY2xpZW50WSxcbiAgICB0b3VjaDIuY2xpZW50WCxcbiAgICB0b3VjaDIuY2xpZW50WVxuICApO1xuXG4gIC8vIE1pbmltdW0gcm90YXRpb24gdGhyZXNob2xkIGZvciBkZXRlY3Rpb25cbiAgY29uc3QgUk9UQVRJT05fVEhSRVNIT0xEID0gMTA7XG5cbiAgLy8gQ2FsY3VsYXRlIHJvdGF0aW9uIGRpZmZlcmVuY2VcbiAgY29uc3Qgcm90YXRpb25EaWZmID0gY3VycmVudEFuZ2xlIC0gc3RhdGUuc3RhcnRBbmdsZTtcblxuICAvLyBDaGVjayBpZiByb3RhdGlvbiBpcyBzaWduaWZpY2FudFxuICBpZiAoTWF0aC5hYnMocm90YXRpb25EaWZmKSA+IFJPVEFUSU9OX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSByb3RhdGUgZXZlbnRcbiAgICBjb25zdCByb3RhdGVFdmVudDogUm90YXRlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJyb3RhdGVcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJyb3RhdGVcIixcbiAgICAgIHJvdGF0aW9uOiByb3RhdGlvbkRpZmYsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJvdGF0ZUV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gR2VzdHVyZSBtYW5hZ2VtZW50IHN5c3RlbSBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICovXG5cbmltcG9ydCB7IFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZVN0YXRlLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIEFueUdlc3R1cmVFdmVudCxcbiAgR0VTVFVSRV9UWVBFUyxcbiAgU1dJUEVfRElSRUNUSU9OU1xufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgZGV0ZWN0VGFwIH0gZnJvbSAnLi90YXAnO1xuaW1wb3J0IHsgZGV0ZWN0U3dpcGUgfSBmcm9tICcuL3N3aXBlJztcbmltcG9ydCB7IGRldGVjdExvbmdQcmVzcywgc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzIH0gZnJvbSAnLi9sb25ncHJlc3MnO1xuaW1wb3J0IHsgZGV0ZWN0UGFuIH0gZnJvbSAnLi9wYW4nO1xuaW1wb3J0IHsgZGV0ZWN0UGluY2ggfSBmcm9tICcuL3BpbmNoJztcbmltcG9ydCB7IGRldGVjdFJvdGF0ZSB9IGZyb20gJy4vcm90YXRlJztcbmltcG9ydCB7IGhhc1RvdWNoU3VwcG9ydCwgaGFzUG9pbnRlclN1cHBvcnQsIGdldFRvdWNoQ29vcmRpbmF0ZXMgfSBmcm9tICcuL3V0aWxzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCBjb25zdGFudHNcbmV4cG9ydCB7IEdFU1RVUkVfVFlQRVMsIFNXSVBFX0RJUkVDVElPTlMgfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZ2VzdHVyZSBtYW5hZ2VyIGZvciBoYW5kbGluZyB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IC0gRE9NIGVsZW1lbnQgdG8gYXR0YWNoIGdlc3R1cmUgcmVjb2duaXRpb24gdG9cbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlR2VzdHVyZU1hbmFnZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBjb25maWc6IEdlc3R1cmVDb25maWcgPSB7fVxuKTogR2VzdHVyZU1hbmFnZXIgPT4ge1xuICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgY29uc3Qgb3B0aW9uczogUmVxdWlyZWQ8R2VzdHVyZUNvbmZpZz4gPSB7XG4gICAgc3dpcGVUaHJlc2hvbGQ6IDMwLFxuICAgIHN3aXBlVGltZVRocmVzaG9sZDogMzAwLFxuICAgIGxvbmdQcmVzc1RpbWU6IDUwMCxcbiAgICB0YXBEaXN0YW5jZVRocmVzaG9sZDogMTAsXG4gICAgcHJldmVudERlZmF1bHQ6IHRydWUsXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAuLi5jb25maWdcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgY29uc3QgaGFuZGxlcnM6IE1hcDxzdHJpbmcsIFNldDxHZXN0dXJlSGFuZGxlcj4+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gR2VzdHVyZSBzdGF0ZVxuICBjb25zdCBzdGF0ZTogR2VzdHVyZVN0YXRlID0ge1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgc3RhcnRUaW1lOiAwLFxuICAgIHN0YXJ0WDogMCxcbiAgICBzdGFydFk6IDAsXG4gICAgbGFzdFg6IDAsXG4gICAgbGFzdFk6IDAsXG4gICAgY3VycmVudFg6IDAsXG4gICAgY3VycmVudFk6IDAsXG4gICAgdG91Y2hDb3VudDogMCxcbiAgICBsb25nUHJlc3NUaW1lcjogbnVsbCxcbiAgICBzdGFydERpc3RhbmNlOiAwLFxuICAgIHN0YXJ0QW5nbGU6IDAsXG4gICAgbGFzdFRhcFRpbWU6IDAsXG4gICAgdGFwQ291bnQ6IDAsXG4gICAgdGFyZ2V0OiBudWxsXG4gIH07XG4gIFxuICAvLyBEZXRlY3QgZmVhdHVyZSBzdXBwb3J0XG4gIGNvbnN0IHN1cHBvcnRUb3VjaCA9IGhhc1RvdWNoU3VwcG9ydCgpO1xuICBjb25zdCBzdXBwb3J0UG9pbnRlciA9IGhhc1BvaW50ZXJTdXBwb3J0KCk7XG4gICAgXG4gIGNvbnN0IGdlc3R1cmVTdXBwb3J0ID0ge1xuICAgIHRhcDogdHJ1ZSxcbiAgICBzd2lwZTogdHJ1ZSxcbiAgICBzd2lwZWxlZnQ6IHRydWUsXG4gICAgc3dpcGVyaWdodDogdHJ1ZSxcbiAgICBzd2lwZXVwOiB0cnVlLFxuICAgIHN3aXBlZG93bjogdHJ1ZSxcbiAgICBsb25ncHJlc3M6IHRydWUsXG4gICAgcGFuOiB0cnVlLFxuICAgIHBpbmNoOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXIsXG4gICAgcm90YXRlOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXJcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGdlc3R1cmUgZXZlbnRcbiAgICovXG4gIGNvbnN0IGRpc3BhdGNoR2VzdHVyZSA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gR2V0IGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50IHR5cGVcbiAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50LnR5cGUpO1xuICAgIGlmICghZXZlbnRIYW5kbGVycykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgZXZlbnRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBnZXN0dXJlIGhhbmRsZXIgZm9yICR7ZXZlbnQudHlwZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEZvciBzd2lwZSwgYWxzbyBkaXNwYXRjaCBkaXJlY3Rpb24tc3BlY2lmaWMgZXZlbnRzXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdzd2lwZScgJiYgJ2RpcmVjdGlvbicgaW4gZXZlbnQpIHtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbkV2ZW50ID0geyAuLi5ldmVudCwgdHlwZTogYHN3aXBlJHtldmVudC5kaXJlY3Rpb259YCBhcyBhbnkgfTtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShkaXJlY3Rpb25FdmVudCBhcyBhbnkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb25cbiAgICBpZiAob3B0aW9ucy5wcmV2ZW50RGVmYXVsdCAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG9wdGlvbnMuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGxvbmdwcmVzcyBjbGVhbnVwIGZ1bmN0aW9uXG4gIGxldCBsb25nUHJlc3NDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICovXG4gIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFN0b3JlIGdlc3R1cmUgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSB0cnVlO1xuICAgIHN0YXRlLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgc3RhdGUuc3RhcnRYID0gc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgc3RhdGUuc3RhcnRZID0gc3RhdGUubGFzdFkgPSBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgc3RhdGUudG91Y2hDb3VudCA9IHRvdWNoQ291bnQ7XG4gICAgc3RhdGUudGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzIGZvciBwaW5jaCBhbmQgcm90YXRlXG4gICAgICBzdGF0ZS5zdGFydERpc3RhbmNlID0gTWF0aC5zcXJ0KFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYLCAyKSArIFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLCAyKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgc3RhdGUuc3RhcnRBbmdsZSA9IE1hdGguYXRhbjIoXG4gICAgICAgIHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFksXG4gICAgICAgIHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFhcbiAgICAgICkgKiAxODAgLyBNYXRoLlBJO1xuICAgICAgXG4gICAgICBpZiAoc3RhdGUuc3RhcnRBbmdsZSA8IDApIHN0YXRlLnN0YXJ0QW5nbGUgKz0gMzYwO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgIH1cbiAgICBcbiAgICBsb25nUHJlc3NDbGVhbnVwID0gZGV0ZWN0TG9uZ1ByZXNzKGNvbnRleHQsIChsb25nUHJlc3NFdmVudCkgPT4ge1xuICAgICAgZGlzcGF0Y2hHZXN0dXJlKGxvbmdQcmVzc0V2ZW50KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgKi9cbiAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBzdGF0ZS5sYXN0WCA9IHN0YXRlLmN1cnJlbnRYO1xuICAgIHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFk7XG4gICAgc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLmN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGNhbmNlbCBsb25ncHJlc3NcbiAgICBpZiAoc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQpICYmIGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZXRlY3QgcGFuIGdlc3R1cmVcbiAgICBjb25zdCBwYW5FdmVudCA9IGRldGVjdFBhbihjb250ZXh0KTtcbiAgICBpZiAocGFuRXZlbnQpIHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShwYW5FdmVudCk7XG4gICAgfVxuICAgIFxuICAgIC8vIE11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHBpbmNoXG4gICAgICBjb25zdCBwaW5jaEV2ZW50ID0gZGV0ZWN0UGluY2goY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHBpbmNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHBpbmNoRXZlbnQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEZXRlY3Qgcm90YXRlXG4gICAgICBjb25zdCByb3RhdGVFdmVudCA9IGRldGVjdFJvdGF0ZShjb250ZXh0LCB0b3VjaDEsIHRvdWNoMik7XG4gICAgICBpZiAocm90YXRlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHJvdGF0ZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgKi9cbiAgY29uc3QgaGFuZGxlRW5kID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFNldHVwIGNvbnRleHQgZm9yIGdlc3R1cmUgZGV0ZWN0aW9uXG4gICAgY29uc3QgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQgPSB7XG4gICAgICBzdGF0ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBlXG4gICAgfTtcbiAgICBcbiAgICAvLyBEZXRlY3QgdGFwXG4gICAgY29uc3QgdGFwRXZlbnQgPSBkZXRlY3RUYXAoY29udGV4dCk7XG4gICAgaWYgKHRhcEV2ZW50KSB7XG4gICAgICAvLyBVcGRhdGUgdGFwIGNvdW50IGZvciBuZXh0IHRhcFxuICAgICAgc3RhdGUubGFzdFRhcFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgc3RhdGUudGFwQ291bnQgPSB0YXBFdmVudC5jb3VudDtcbiAgICAgIFxuICAgICAgZGlzcGF0Y2hHZXN0dXJlKHRhcEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGV0ZWN0IHN3aXBlXG4gICAgICBjb25zdCBzd2lwZUV2ZW50ID0gZGV0ZWN0U3dpcGUoY29udGV4dCk7XG4gICAgICBpZiAoc3dpcGVFdmVudCkge1xuICAgICAgICBkaXNwYXRjaEdlc3R1cmUoc3dpcGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgKi9cbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIENhbmNlbCBsb25nIHByZXNzIGRldGVjdGlvblxuICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHJlZmVyZW5jZXNcbiAgbGV0IGV2ZW50TGlzdGVuZXJzOiB7IFxuICAgIFtldmVudDogc3RyaW5nXTogRXZlbnRMaXN0ZW5lciBcbiAgfSA9IHt9O1xuICBcbiAgLyoqXG4gICAqIFNldCB1cCBldmVudCBsaXN0ZW5lcnMgYmFzZWQgb24gYXZhaWxhYmxlIEFQSXNcbiAgICovXG4gIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAvLyBVc2UgUG9pbnRlciBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgcG9pbnRlcmRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJ1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc3VwcG9ydFRvdWNoKSB7XG4gICAgICAvLyBVc2UgVG91Y2ggRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIE1vdXNlIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgeyBwYXNzaXZlOiAhb3B0aW9ucy5wcmV2ZW50RGVmYXVsdCB9KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgKi9cbiAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhciBldmVudExpc3RlbmVycyBvYmplY3RcbiAgICBldmVudExpc3RlbmVycyA9IHt9O1xuICB9O1xuICBcbiAgLy8gSW5pdGlhbGl6ZSBldmVudCBsaXN0ZW5lcnNcbiAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICBcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyXG4gICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBsaXN0ZW4gZm9yXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcik6IEdlc3R1cmVNYW5hZ2VyIHtcbiAgICAgIGlmICghaGFuZGxlcnMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGV2ZW50VHlwZSwgbmV3IFNldCgpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSkhLmFkZChoYW5kbGVyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9mZihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSk7XG4gICAgICBpZiAoZXZlbnRIYW5kbGVycykge1xuICAgICAgICBldmVudEhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChldmVudEhhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBoYW5kbGVycy5kZWxldGUoZXZlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICovXG4gICAgaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGdlc3R1cmVUeXBlIGluIGdlc3R1cmVTdXBwb3J0ICYmIGdlc3R1cmVTdXBwb3J0W2dlc3R1cmVUeXBlIGFzIGtleW9mIHR5cGVvZiBnZXN0dXJlU3VwcG9ydF07XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSBhZGRpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGVuYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSByZW1vdmluZyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgZGlzYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnMgYW5kIHRpbWVyc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBDbGVhbiB1cCBsaXN0ZW5lcnNcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGhhbmRsZXIgcmVmZXJlbmNlc1xuICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG59OyIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXMgdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgQW55R2VzdHVyZUV2ZW50LFxufSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgZ2VzdHVyZXMgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzRmVhdHVyZUNvbmZpZyBleHRlbmRzIEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVHZXN0dXJlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgZ2VzdHVyZSBldmVudCBoYW5kbGVyc1xuICAgKi9cbiAgZ2VzdHVyZUhhbmRsZXJzPzogUmVjb3JkPHN0cmluZywgR2VzdHVyZUhhbmRsZXI+O1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAgICovXG4gIGdlc3R1cmVzOiBHZXN0dXJlTWFuYWdlcjtcblxuICAvKipcbiAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25HZXN0dXJlOiAoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZ2VzdHVyZSB0eXBlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAqL1xuICBpc0dlc3R1cmVTdXBwb3J0ZWQ6IChnZXN0dXJlVHlwZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGNvbXByZWhlbnNpdmUgZ2VzdHVyZSBmZWF0dXJlIHRoYXQgYWRkcyBzdXBwb3J0IGZvciBhbGwgZ2VzdHVyZSB0eXBlcy5cbiAqIEZvciBtb3JlIGxpZ2h0d2VpZ2h0LCBzcGVjaWZpYyBnZXN0dXJlcywgdXNlIHRoZSBpbmRpdmlkdWFsIGdlc3R1cmUgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgZ2VzdHVyZSBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGdlc3R1cmUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aEdlc3R1cmVzKHtcbiAqICAgICBzd2lwZVRocmVzaG9sZDogNTAsXG4gKiAgICAgZ2VzdHVyZUhhbmRsZXJzOiB7XG4gKiAgICAgICAndGFwJzogKGUpID0+IGhhbmRsZVRhcChlKSxcbiAqICAgICAgICdzd2lwZWxlZnQnOiAoZSkgPT4gbmF2aWdhdGVGb3J3YXJkKGUpLFxuICogICAgICAgJ3N3aXBlcmlnaHQnOiAoZSkgPT4gbmF2aWdhdGVCYWNrKGUpXG4gKiAgICAgfVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoR2VzdHVyZXMgPVxuICAoY29uZmlnOiBHZXN0dXJlc0ZlYXR1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgR2VzdHVyZXNDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgR2VzdHVyZXNDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlR2VzdHVyZXMgPSB0cnVlLFxuICAgICAgZ2VzdHVyZUhhbmRsZXJzID0ge30sXG4gICAgICAuLi5nZXN0dXJlQ29uZmlnXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIENyZWF0ZSBnZXN0dXJlIG1hbmFnZXJcbiAgICBjb25zdCBnZXN0dXJlTWFuYWdlciA9IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyKFxuICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBnZXN0dXJlQ29uZmlnXG4gICAgKTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGdlc3R1cmUgaGFuZGxlcnNcbiAgICBPYmplY3QuZW50cmllcyhnZXN0dXJlSGFuZGxlcnMpLmZvckVhY2goKFtldmVudFR5cGUsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBnZXN0dXJlTWFuYWdlci5vbihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5hYmxlL2Rpc2FibGUgYmFzZWQgb24gY29uZmlnXG4gICAgaWYgKCFlbmFibGVHZXN0dXJlcykge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIENvbm5lY3Qgd2l0aCBleGlzdGluZyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgLy8gRm9yd2FyZCBnZXN0dXJlIGV2ZW50cyB0byB0aGUgY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtXG4gICAgICBjb25zdCBmb3J3YXJkR2VzdHVyZUV2ZW50cyA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGZvcndhcmRlciBmb3IgY29tbW9uIGdlc3R1cmUgdHlwZXNcbiAgICAgIFtcbiAgICAgICAgXCJ0YXBcIixcbiAgICAgICAgXCJzd2lwZVwiLFxuICAgICAgICBcInN3aXBlbGVmdFwiLFxuICAgICAgICBcInN3aXBlcmlnaHRcIixcbiAgICAgICAgXCJzd2lwZXVwXCIsXG4gICAgICAgIFwic3dpcGVkb3duXCIsXG4gICAgICAgIFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIFwicGluY2hcIixcbiAgICAgICAgXCJyb3RhdGVcIixcbiAgICAgICAgXCJwYW5cIixcbiAgICAgIF0uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5vbih0eXBlLCBmb3J3YXJkR2VzdHVyZUV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGdlc3R1cmVzOiBnZXN0dXJlTWFuYWdlcixcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSBldmVudFxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub2ZmKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICAgKi9cbiAgICAgIGlzR2VzdHVyZVN1cHBvcnRlZChnZXN0dXJlVHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXN0dXJlTWFuYWdlci5pc1N1cHBvcnRlZChnZXN0dXJlVHlwZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlR2VzdHVyZXMoKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmVuYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5kaXNhYmxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGFwIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogRGlzdGFuY2UgdGhyZXNob2xkIChpbiBwaXhlbHMpIGZvciB0YXAgcmVjb2duaXRpb25cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHRhcERpc3RhbmNlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgdGFwIGdlc3R1cmVcbiAgICovXG4gIG9uVGFwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRhcCByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uVGFwOiAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRhcCByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gdGFwIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyB0YXAgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCB0YXAgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhUYXBHZXN0dXJlKHtcbiAqICAgICBvblRhcDogKGUpID0+IGNvbnNvbGUubG9nKCdUYXBwZWQgYXQnLCBlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFRhcEdlc3R1cmUgPVxuICAoY29uZmlnOiBUYXBHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFRhcEdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFRhcEdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uVGFwLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogVGFwRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25UYXApIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvblRhcCBhcyAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgbGFzdFRhcFRpbWUgPSAwO1xuICAgIGxldCB0YXBDb3VudCA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIHRhcCBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFRhcCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgeDogbnVtYmVyLFxuICAgICAgeTogbnVtYmVyXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBsYXN0VGFwVGltZSA8IDMwMDtcblxuICAgICAgaWYgKGlzRG91YmxlVGFwKSB7XG4gICAgICAgIHRhcENvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXBDb3VudCA9IDE7XG4gICAgICB9XG5cbiAgICAgIGxhc3RUYXBUaW1lID0gbm93O1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHRhcCBldmVudFxuICAgICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInRhcFwiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBub3csXG4gICAgICAgIGR1cmF0aW9uOiBub3cgLSBzdGFydFRpbWUsXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih0YXBFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHRhcCBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJ0YXBcIiwgdGFwRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgdGFwRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPVxuICAgICAgICBcImNoYW5nZWRUb3VjaGVzXCIgaW4gZSAmJiBlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGUuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgICA6IChlIGFzIE1vdXNlRXZlbnQpO1xuXG4gICAgICBjb25zdCBlbmRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIGNvbnN0IGVuZFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgbW92ZWRcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgaWYgKGRpc3RhbmNlIDwgdGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgZGlzcGF0Y2hUYXAoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSB0YXAgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvZmZUYXAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvc3dpcGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQge1xuICBTd2lwZUV2ZW50LFxuICBTV0lQRV9ESVJFQ1RJT05TLFxuICBHZXN0dXJlSGFuZGxlcixcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHN3aXBlIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIGRpc3RhbmNlIChpbiBwaXhlbHMpIHRvIHJlY29nbml6ZSBhIHN3aXBlXG4gICAqIEBkZWZhdWx0IDMwXG4gICAqL1xuICBzd2lwZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgaW4gd2hpY2ggYSBzd2lwZSBtdXN0IGJlIGNvbXBsZXRlZFxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIHN3aXBlVGltZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGFueSBzd2lwZSBkaXJlY3Rpb25cbiAgICovXG4gIG9uU3dpcGU/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGxlZnQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlTGVmdD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgcmlnaHQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlUmlnaHQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHVwIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVVwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBkb3duIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZURvd24/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgc3dpcGUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dpcGVHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZUxlZnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHN3aXBlIGV2ZW50IGhhbmRsZXIgZm9yIGFueSBkaXJlY3Rpb25cbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxlZnQgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHJpZ2h0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlUmlnaHQ6IChcbiAgICBoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiB1cCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVVwOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGRvd24gc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHN3aXBlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICpcbiAqIEBwYXJhbSBkZWx0YVggLSBEaXN0YW5jZSBtb3ZlZCBpbiBYIGRpcmVjdGlvblxuICogQHBhcmFtIGRlbHRhWSAtIERpc3RhbmNlIG1vdmVkIGluIFkgZGlyZWN0aW9uXG4gKiBAcmV0dXJucyBEaXJlY3Rpb24gb2YgdGhlIHN3aXBlXG4gKi9cbmZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIEFkZHMgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBsaWdodHdlaWdodCBhbHRlcm5hdGl2ZSB0byB0aGUgZnVsbCBnZXN0dXJlIHN5c3RlbSxcbiAqIGZvY3VzZWQgb25seSBvbiBzd2lwZSBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgc3dpcGUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBzd2lwZSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFkZCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoU3dpcGVHZXN0dXJlKHtcbiAqICAgICBvblN3aXBlTGVmdDogKCkgPT4gc2hvd05leHRQYWdlKCksXG4gKiAgICAgb25Td2lwZVJpZ2h0OiAoKSA9PiBzaG93UHJldmlvdXNQYWdlKClcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFN3aXBlR2VzdHVyZSA9XG4gIChjb25maWc6IFN3aXBlR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBTd2lwZUdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHN3aXBlVGhyZXNob2xkID0gMzAsXG4gICAgICBzd2lwZVRpbWVUaHJlc2hvbGQgPSAzMDAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblN3aXBlLFxuICAgICAgb25Td2lwZUxlZnQsXG4gICAgICBvblN3aXBlUmlnaHQsXG4gICAgICBvblN3aXBlVXAsXG4gICAgICBvblN3aXBlRG93bixcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IGRpcmVjdGlvblxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgc3dpcGU6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVsZWZ0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlcmlnaHQ6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGV1cDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZWRvd246IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblN3aXBlKSBoYW5kbGVycy5zd2lwZS5hZGQob25Td2lwZSBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlTGVmdClcbiAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5hZGQob25Td2lwZUxlZnQgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZVJpZ2h0KVxuICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQob25Td2lwZVJpZ2h0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVVcClcbiAgICAgIGhhbmRsZXJzLnN3aXBldXAuYWRkKG9uU3dpcGVVcCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlRG93bilcbiAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQob25Td2lwZURvd24gYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBzd2lwZSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVyc1xuICAgICAqL1xuICAgIGNvbnN0IGRpc3BhdGNoU3dpcGUgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIGVuZFg6IG51bWJlcixcbiAgICAgIGVuZFk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gZW5kWCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGVuZFkgLSBzdGFydFk7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGRpc3RhbmNlIC8gZHVyYXRpb247XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3dpcGUgZXZlbnRcbiAgICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwic3dpcGVcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBkZWx0YVgsXG4gICAgICAgIGRlbHRhWSxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIHZlbG9jaXR5LFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IHRyaWdnZXIgZ2VuZXJpYyBzd2lwZSBoYW5kbGVyc1xuICAgICAgaGFuZGxlcnMuc3dpcGUuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoc3dpcGVFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHN3aXBlIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZW4gdHJpZ2dlciBkaXJlY3Rpb24tc3BlY2lmaWMgaGFuZGxlcnNcbiAgICAgIGNvbnN0IGRpcmVjdGlvbktleSA9IGBzd2lwZSR7ZGlyZWN0aW9ufWAgYXMga2V5b2YgdHlwZW9mIGhhbmRsZXJzO1xuICAgICAgaGFuZGxlcnNbZGlyZWN0aW9uS2V5XS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih7IC4uLnN3aXBlRXZlbnQsIHR5cGU6IGRpcmVjdGlvbktleSB9IGFzIFN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluICR7ZGlyZWN0aW9uS2V5fSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcInN3aXBlXCIsIHN3aXBlRXZlbnQpO1xuICAgICAgICBjb21wb25lbnQuZW1pdChkaXJlY3Rpb25LZXksIHN3aXBlRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBzd2lwZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHN3aXBlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHN3aXBlXG4gICAgICBpZiAoZGlzdGFuY2UgPj0gc3dpcGVUaHJlc2hvbGQgJiYgZHVyYXRpb24gPD0gc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoU3dpcGUoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhoYW5kbGVycykuZm9yRWFjaCgoaGFuZGxlclNldCkgPT4gaGFuZGxlclNldC5jbGVhcigpKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLy8gQWRkIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb25Td2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVMZWZ0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlRG93bihoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVkb3duLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZTd2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVJpZ2h0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXJpZ2h0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBkaXNhYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL2xvbmdwcmVzcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgTG9uZ1ByZXNzRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGxvbmcgcHJlc3MgZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaW1lIChpbiBtcykgdG8gcmVjb2duaXplIGEgbG9uZyBwcmVzc1xuICAgKiBAZGVmYXVsdCA1MDBcbiAgICovXG4gIGxvbmdQcmVzc1RpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgbW92ZW1lbnQgdGhhdCBjYW5jZWxzIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIG1vdmVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBsb25nIHByZXNzIGdlc3R1cmVcbiAgICovXG4gIG9uTG9uZ1ByZXNzPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUxvbmdQcmVzczogKCkgPT4gTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gbG9uZyBwcmVzcyBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgbG9uZyBwcmVzcyBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoTG9uZ1ByZXNzR2VzdHVyZSh7XG4gKiAgICAgbG9uZ1ByZXNzVGltZTogODAwLFxuICogICAgIG9uTG9uZ1ByZXNzOiAoZSkgPT4gc2hvd0NvbnRleHRNZW51KGUueCwgZS55KVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTG9uZ1ByZXNzR2VzdHVyZSA9XG4gIChjb25maWc6IExvbmdQcmVzc0dlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNhbm5vdCBhZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIlxuICAgICAgKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbG9uZ1ByZXNzVGltZSA9IDUwMCxcbiAgICAgIG1vdmVUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uTG9uZ1ByZXNzLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25Mb25nUHJlc3MpIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvbkxvbmdQcmVzcyBhcyAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxvbmdQcmVzc1RpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgbG9uZyBwcmVzcyBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaExvbmdQcmVzcyA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICBjb25zdCBsb25nUHJlc3NFdmVudDogTG9uZ1ByZXNzRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBsb25nUHJlc3NFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICB4OiBjdXJyZW50WCxcbiAgICAgICAgeTogY3VycmVudFksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIobG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBsb25nIHByZXNzIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcImxvbmdwcmVzc1wiLCBsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHByZXZlbnREZWZhdWx0IGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChwcmV2ZW50RGVmYXVsdCAmJiAhbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBsb25nUHJlc3NFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgZXhpc3RpbmcgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGxvbmdQcmVzc1RpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgd2FzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hMb25nUHJlc3MoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfSwgbG9uZ1ByZXNzVGltZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGV4Y2VlZHMgdGhyZXNob2xkXG4gICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgaWYgKGRpc3RhbmNlID4gbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBpZiBtb3ZlZCB0b28gbXVjaFxuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIGRpY3Rpb25hcnlcbiAgICBjb25zdCBldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgRXZlbnRMaXN0ZW5lcj4gPSB7XG4gICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2htb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBoYW5kbGVycy5jbGVhcigpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlTG9uZ1ByZXNzKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBhbnkgdGltZXJzXG4gICAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwYW4gZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIHN0YXJ0IChmaXJzdCBtb3ZlbWVudClcbiAgICovXG4gIG9uUGFuU3RhcnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcyBkdXJpbmcgcGFuKVxuICAgKi9cbiAgb25QYW4/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIGVuZCAodG91Y2gvbW91c2UgcmVsZWFzZSlcbiAgICovXG4gIG9uUGFuRW5kPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHBhbiByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogRXh0ZW5kIHRoZSBQYW5FdmVudCBpbnRlcmZhY2UgdG8gc3VwcG9ydCBvdXIgY3VzdG9tIGV2ZW50IHR5cGVzXG4gKi9cbmludGVyZmFjZSBFeHRlbmRlZFBhbkV2ZW50IGV4dGVuZHMgT21pdDxQYW5FdmVudCwgXCJ0eXBlXCI+IHtcbiAgdHlwZTogXCJwYW5cIiB8IFwicGFuc3RhcnRcIiB8IFwicGFuZW5kXCI7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIHN0YXJ0XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcylcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIGVuZFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gc3RhcnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuU3RhcnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gbW92ZSBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW46IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gZW5kIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhbkVuZDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHBhbiByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gcGFuIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyBwYW4gc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBwYW4gY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhQYW5HZXN0dXJlKHtcbiAqICAgICBvblBhblN0YXJ0OiAoZSkgPT4gc3RhcnREcmFnKGUpLFxuICogICAgIG9uUGFuOiAoZSkgPT4gdXBkYXRlRHJhZ1Bvc2l0aW9uKGUpLFxuICogICAgIG9uUGFuRW5kOiAoZSkgPT4gZW5kRHJhZyhlKVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoUGFuR2VzdHVyZSA9XG4gIChjb25maWc6IFBhbkdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgUGFuR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFwiQ2Fubm90IGFkZCBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgUGFuR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblBhblN0YXJ0LFxuICAgICAgb25QYW4sXG4gICAgICBvblBhbkVuZCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IHBhbiBwaGFzZVxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgcGFuc3RhcnQ6IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbjogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgcGFuZW5kOiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgfTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGhhbmRsZXJzIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9uUGFuU3RhcnQpXG4gICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQob25QYW5TdGFydCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25QYW4pIGhhbmRsZXJzLnBhbi5hZGQob25QYW4gYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuRW5kKSBoYW5kbGVycy5wYW5lbmQuYWRkKG9uUGFuRW5kIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgbGFzdFggPSAwO1xuICAgIGxldCBsYXN0WSA9IDA7XG4gICAgbGV0IGN1cnJlbnRYID0gMDtcbiAgICBsZXQgY3VycmVudFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYW4gZXZlbnQgd2l0aCB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZVBhbkV2ZW50ID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICB0eXBlOiBcInBhbnN0YXJ0XCIgfCBcInBhblwiIHwgXCJwYW5lbmRcIlxuICAgICk6IEV4dGVuZGVkUGFuRXZlbnQgPT4ge1xuICAgICAgY29uc3QgZXZlbnQ6IEV4dGVuZGVkUGFuRXZlbnQgPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBkZWx0YVg6IGN1cnJlbnRYIC0gc3RhcnRYLFxuICAgICAgICBkZWx0YVk6IGN1cnJlbnRZIC0gc3RhcnRZLFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgY3VycmVudFgsXG4gICAgICAgIGN1cnJlbnRZLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBwYW4gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFBhbiA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGV4dGVuZGVkUGFuRXZlbnQgPSBjcmVhdGVQYW5FdmVudChlLCB0eXBlKTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXIgZm9yIHRoaXMgcGhhc2VcbiAgICAgIGhhbmRsZXJzW3R5cGVdLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUeXBlIGFzc2VydGlvbiBmb3IgdGhlIGhhbmRsZXIgY2FsbCAtIHdlJ3JlIGRlbGliZXJhdGVseSBwYXNzaW5nIG91ciBleHRlbmRlZCBldmVudFxuICAgICAgICAgIGhhbmRsZXIoZXh0ZW5kZWRQYW5FdmVudCBhcyB1bmtub3duIGFzIFBhbkV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke3R5cGV9IGhhbmRsZXI6YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KHR5cGUsIGV4dGVuZGVkUGFuRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWV4dGVuZGVkUGFuRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBleHRlbmRlZFBhbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSBsYXN0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGxhc3RZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgICBpc1Bhbm5pbmcgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVNb3ZlID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvblxuICAgICAgbGFzdFggPSBjdXJyZW50WDtcbiAgICAgIGxhc3RZID0gY3VycmVudFk7XG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBtb3ZlbWVudCBkZWx0YVxuICAgICAgY29uc3QgbW92ZURlbHRhWCA9IGN1cnJlbnRYIC0gbGFzdFg7XG4gICAgICBjb25zdCBtb3ZlRGVsdGFZID0gY3VycmVudFkgLSBsYXN0WTtcbiAgICAgIGNvbnN0IG1vdmVEZWx0YSA9IE1hdGguc3FydChcbiAgICAgICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZWN0IHNpZ25pZmljYW50IG1vdmVtZW50XG4gICAgICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzaWduaWZpY2FudCBtb3ZlbWVudCwgdHJpZ2dlciBwYW5zdGFydFxuICAgICAgICBpZiAoIWlzUGFubmluZykge1xuICAgICAgICAgIGlzUGFubmluZyA9IHRydWU7XG4gICAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5zdGFydFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW4gdHJpZ2dlciB0aGUgY29udGludW91cyBwYW4gZXZlbnRcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5cIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25QYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuRW5kKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuZW5kLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZQYW5TdGFydChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbnN0YXJ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlUGFuKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9zY2hlbWFcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzY2hlbWEgcHJvY2Vzc29yIHdpdGggaW50ZWdyYXRlZCBvcHRpbWl6YXRpb25zXG4gKiBDb25zb2xpZGF0ZXMgYXJyYXksIG9iamVjdCwgSlNYLCBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTIChFc3NlbnRpYWwgb25seSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xuICAvKiogQmFzZSBsYXlvdXQgdHlwZSAqL1xuICB0eXBlPzogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgc3RyaW5nO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzICovXG4gIGdhcD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBBbGlnbm1lbnQgb2YgaXRlbXMgYWxvbmcgdGhlIGNyb3NzIGF4aXMgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBtYWluIGF4aXMgKi9cbiAganVzdGlmeT86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiIHwgXCJiZXR3ZWVuXCIgfCBcImFyb3VuZFwiIHwgXCJldmVubHlcIjtcbiAgLyoqIFdoZXRoZXIgYW5kIGhvdyBpdGVtcyBzaG91bGQgd3JhcCAqL1xuICB3cmFwPzogYm9vbGVhbiB8IFwicmV2ZXJzZVwiIHwgXCJub3dyYXBcIjtcbiAgLyoqIFdoZXRoZXIgcm93IGl0ZW1zIHNob3VsZCBzdGFjayB2ZXJ0aWNhbGx5IG9uIG1vYmlsZSAqL1xuICBtb2JpbGVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc2Nyb2xsIGhvcml6b250YWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU2Nyb2xsPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjb2x1bW5zIG9yIGF1dG9tYXRpYyBzaXppbmcgbWV0aG9kICovXG4gIGNvbHVtbnM/OiBudW1iZXIgfCBcImF1dG8tZml0XCIgfCBcImF1dG8tZmlsbFwiO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVuc2UgcGFja2luZyBhbGdvcml0aG0gZm9yIGdyaWQgKi9cbiAgZGVuc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBncmlkIGl0ZW1zIHNob3VsZCBhZGp1c3QgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKi9cbiAgYXV0b0hlaWdodD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SXRlbUNvbmZpZyB7XG4gIC8qKiBDb2x1bW4gd2lkdGggaW4gYSAxMi1jb2x1bW4gZ3JpZCAqL1xuICB3aWR0aD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIHNtYWxsIHNjcmVlbnMgKi9cbiAgc20/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBtZWRpdW0gc2NyZWVucyAqL1xuICBtZD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIGxhcmdlIHNjcmVlbnMgKi9cbiAgbGc/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBleHRyYS1sYXJnZSBzY3JlZW5zICovXG4gIHhsPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgY29sdW1ucyB0byBzcGFuICovXG4gIHNwYW4/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgZ3JpZCByb3dzIHRvIHNwYW4gKi9cbiAgcm93U3Bhbj86IG51bWJlcjtcbiAgLyoqIERpc3BsYXkgb3JkZXIgKi9cbiAgb3JkZXI/OiBudW1iZXIgfCBcImZpcnN0XCIgfCBcImxhc3RcIjtcbiAgLyoqIFNlbGYtYWxpZ25tZW50IHdpdGhpbiBjb250YWluZXIgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogV2hldGhlciBpdGVtIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNpemUgKi9cbiAgYXV0bz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGNyZWF0b3IgZnVuY3Rpb24gdG8gdXNlIGlmIG5vdCBzcGVjaWZpZWQgaW4gc2NoZW1hICovXG4gIGNyZWF0b3I/OiBGdW5jdGlvbjtcbiAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgQ1NTIGNsYXNzIHByZWZpeCBAZGVmYXVsdCB0cnVlICovXG4gIHByZWZpeD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFJlc3VsdCB7XG4gIC8qKiBUaGUgcmF3IGxheW91dCBvYmplY3Qgd2l0aCBhbGwgY29tcG9uZW50cyAqL1xuICBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBmb3IgY29udmVuaWVuY2UgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBhbnk7XG4gIC8qKiBGbGF0dGVuZWQgY29tcG9uZW50IG1hcCAqL1xuICBjb21wb25lbnQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWUgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGFueTtcbiAgLyoqIEdldHMgYWxsIGNvbXBvbmVudHMgaW4gYSBmbGF0dGVuZWQgbWFwICovXG4gIGdldEFsbCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogRGVzdHJveXMgdGhlIGxheW91dCwgY2xlYW5pbmcgdXAgYWxsIGNvbXBvbmVudHMgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG50eXBlIENvbXBvbmVudExpa2UgPSB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbnR5cGUgU2NoZW1hSXRlbSA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IFNjaGVtYUl0ZW1bXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTFQtSU4gT1BUSU1JWkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZyYWdtZW50IFBvb2wgZm9yIGVmZmljaWVudCBEb2N1bWVudEZyYWdtZW50IHJldXNlXG4gKiBSZWR1Y2VzIEdDIHByZXNzdXJlIGluIGhpZ2gtZnJlcXVlbmN5IGxheW91dCBjcmVhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY2xhc3MgRnJhZ21lbnRQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBEb2N1bWVudEZyYWdtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhTaXplID0gODsgLy8gT3B0aW1pemVkIHNpemUgZm9yIG1lbW9yeSBlZmZpY2llbmN5XG5cbiAgZ2V0KCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiB0aGlzLnBvb2wucG9wKCkgfHwgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB9XG5cbiAgcmVsZWFzZShmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhTaXplICYmIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBvb2wucHVzaChmcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuY29uc3QgZnJhZ21lbnRQb29sID0gbmV3IEZyYWdtZW50UG9vbCgpO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgY2FjaGUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uc1xuICogUmVkdWNlcyBzdHJpbmcgb3BlcmF0aW9ucyBieSBjYWNoaW5nIGdlbmVyYXRlZCBjbGFzcyBuYW1lc1xuICovXG5jb25zdCBjbGFzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5jb25zdCBQUkVGSVhfV0lUSF9EQVNIID0gYCR7UFJFRklYfS1gO1xuXG4vKipcbiAqIEdldHMgYSBjYWNoZWQgY2xhc3MgbmFtZSBmb3IgbGF5b3V0IGNvbmZpZ3VyYXRpb25cbiAqIE9wdGltaXplZCBmb3IgZGlmZmVyZW50IGNsYXNzIG5hbWluZyBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRDbGFzc05hbWUoXG4gIHR5cGU6IHN0cmluZyxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IGAke3R5cGV9LSR7cHJvcGVydHl9LSR7dmFsdWV9YDtcbiAgaWYgKCFjbGFzc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiaXRlbVwiKSB7XG4gICAgICBjbGFzc0NhY2hlLnNldChcbiAgICAgICAga2V5LFxuICAgICAgICBwcm9wZXJ0eSA9PT0gXCJcIlxuICAgICAgICAgID8gYGxheW91dF9faXRlbS0tJHt2YWx1ZX1gXG4gICAgICAgICAgOiBgbGF5b3V0X19pdGVtLS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgbGF5b3V0IGNsYXNzZXMsIGFsaWduIHVzZXMgbGF5b3V0LS17dHlwZX0te3ZhbHVlfVxuICAgICAgLy8gYnV0IGp1c3RpZnkgYW5kIG90aGVycyB1c2UgbGF5b3V0LS17dHlwZX0te3Byb3BlcnR5fS17dmFsdWV9XG4gICAgICBpZiAocHJvcGVydHkgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ2FjaGUuc2V0KGtleSwgYGxheW91dC0tJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3NDYWNoZS5nZXQoa2V5KSE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9QVElNSVpFRCBVVElMSVRJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBvYmplY3QgKGhhcyBhbiBlbGVtZW50IHByb3BlcnR5KVxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogdmFsdWUgaXMgQ29tcG9uZW50TGlrZSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyYWdtZW50IHVzaW5nIHBvb2xpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGZyYWdtZW50UG9vbC5nZXQoKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhIGZyYWdtZW50IGJhY2sgdG8gdGhlIHBvb2wgZm9yIHJldXNlXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wucmVsZWFzZShmcmFnbWVudCk7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIGNsYXNzIHByb2Nlc3Npbmcgd2l0aCBtaW5pbWFsIHN0cmluZyBvcGVyYXRpb25zXG4gKiBIYW5kbGVzIGFycmF5cywgc3RyaW5ncywgY2xhc3NOYW1lIGFsaWFzZXMsIGFuZCByYXdDbGFzcyBlZmZpY2llbnRseVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NOYW1lcyhcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2tpcFByZWZpeCA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgY29uc3QgaGFzUmF3Q2xhc3MgPSBvcHRpb25zLnJhd0NsYXNzO1xuICBjb25zdCBoYXNSZWd1bGFyQ2xhc3MgPSBvcHRpb25zLmNsYXNzIHx8IG9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gIC8vIEZhc3QgcGF0aDogbm8gY2xhc3MgcHJvcGVydGllcyBhdCBhbGxcbiAgaWYgKCFoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzKSByZXR1cm4gb3B0aW9ucztcblxuICAvLyBGYXN0IHBhdGg6IG9ubHkgcmF3Q2xhc3MgYW5kIHNraXBwaW5nIHByZWZpeCAobW9zdCBjb21tb24gcmF3Q2xhc3Mgc2NlbmFyaW8pXG4gIGlmIChoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzICYmIHNraXBQcmVmaXgpIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gICAgLy8gRGlyZWN0IGFzc2lnbm1lbnQgZm9yIHNpbXBsZSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGhhc1Jhd0NsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGFycmF5IGNhc2VcbiAgICAgIHByb2Nlc3NlZC5jbGFzcyA9IGhhc1Jhd0NsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG5cbiAgLy8gRnVsbCBwcm9jZXNzaW5nIHBhdGggKG9ubHkgd2hlbiBuZWVkZWQpXG4gIGNvbnN0IHByb2Nlc3NlZCA9IHsgLi4ub3B0aW9ucyB9O1xuICBsZXQgZmluYWxDbGFzc2VzID0gXCJcIjtcblxuICAvLyBIYW5kbGUgcHJlZml4ZWQgY2xhc3NlcyBvbmx5IGlmIG5vdCBza2lwcGluZyBwcmVmaXhcbiAgaWYgKCFza2lwUHJlZml4ICYmIGhhc1JlZ3VsYXJDbGFzcykge1xuICAgIGxldCBwcmVmaXhlZFN0cmluZyA9IFwiXCI7XG5cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSBBcnJheS5pc0FycmF5KHByb2Nlc3NlZC5jbGFzcylcbiAgICAgICAgPyBwcm9jZXNzZWQuY2xhc3Muam9pbihcIiBcIilcbiAgICAgICAgOiBwcm9jZXNzZWQuY2xhc3M7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzZWQuY2xhc3NOYW1lKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSAocHJlZml4ZWRTdHJpbmcgPyBcIiBcIiA6IFwiXCIpICsgcHJvY2Vzc2VkLmNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4ZWRTdHJpbmcpIHtcbiAgICAgIGZpbmFsQ2xhc3NlcyA9IHByZWZpeGVkU3RyaW5nXG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgoY2xzKSA9PlxuICAgICAgICAgIGNscy5zdGFydHNXaXRoKFBSRUZJWF9XSVRIX0RBU0gpID8gY2xzIDogUFJFRklYX1dJVEhfREFTSCArIGNscyxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHJhd0NsYXNzIChhbHdheXMgcHJvY2Vzc2VkIHdoZW4gcHJlc2VudClcbiAgaWYgKGhhc1Jhd0NsYXNzKSB7XG4gICAgY29uc3QgcmF3U3RyaW5nID0gQXJyYXkuaXNBcnJheShoYXNSYXdDbGFzcylcbiAgICAgID8gaGFzUmF3Q2xhc3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICAgICA6IGhhc1Jhd0NsYXNzO1xuXG4gICAgZmluYWxDbGFzc2VzICs9IChmaW5hbENsYXNzZXMgPyBcIiBcIiA6IFwiXCIpICsgcmF3U3RyaW5nO1xuICB9XG5cbiAgaWYgKGZpbmFsQ2xhc3Nlcykge1xuICAgIHByb2Nlc3NlZC5jbGFzcyA9IGZpbmFsQ2xhc3NlcztcbiAgfVxuXG4gIC8vIENsZWFuIHVwIGluIG9uZSBvcGVyYXRpb25cbiAgZGVsZXRlIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gIGRlbGV0ZSBwcm9jZXNzZWQucmF3Q2xhc3M7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZWQgcGFyYW1ldGVyIGV4dHJhY3Rpb24gZm9yIGFycmF5IHNjaGVtYXNcbiAqIFJlZHVjZXMgbXVsdGlwbGUgYXJyYXkgbG9va3VwcyB3aXRoIGJhdGNoIHByb2Nlc3NpbmdcbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjcmVhdG9yOiBGdW5jdGlvbjtcbiAgbmFtZT86IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3VtZWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBhcmFtZXRlcnMoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGRlZmF1bHRDcmVhdG9yOiBGdW5jdGlvbixcbik6IEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjb25zdCBpdGVtcyA9IHNjaGVtYS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgMyk7XG4gIGxldCBjcmVhdG9yLCBuYW1lLCBvcHRpb25zO1xuICBsZXQgY29uc3VtZWQgPSAxO1xuXG4gIGNvbnN0IFtmaXJzdCwgc2Vjb25kLCB0aGlyZF0gPSBpdGVtcztcblxuICBpZiAodHlwZW9mIGZpcnN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcmVhdG9yID0gZmlyc3Q7XG4gICAgaWYgKHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgICBpZiAoaXNPYmplY3QodGhpcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlyZDtcbiAgICAgICAgY29uc3VtZWQgPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG5hbWUgPSBmaXJzdDtcbiAgICBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlyc3QpKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG9wdGlvbnMgPSBmaXJzdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvcjogY3JlYXRvciB8fCBkZWZhdWx0Q3JlYXRvcixcbiAgICBuYW1lLFxuICAgIG9wdGlvbnM6IChvcHRpb25zIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbnN1bWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgdHlwZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gVVRJTElUSUVTIChTaW1wbGlmaWVkKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBET00gZWxlbWVudCBjcmVhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgdGFnID0gb3B0aW9ucy50YWcgfHwgXCJkaXZcIjtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAob3B0aW9ucy5jbGFzcykge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgb3B0aW9ucy5zdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGV4dENvbnRlbnQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBDT01QT05FTlQgQ1JFQVRJT04gKHdpdGggZGVzdHJ1Y3R1cmluZyBvcHRpbWl6YXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG9wdGltaXplZCBvcHRpb24gcHJvY2Vzc2luZ1xuICogVXNlcyBkZXN0cnVjdHVyaW5nIGZvciBjbGVhbmVyIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gIENvbXBvbmVudDogYW55LFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBhbnkge1xuICB0cnkge1xuICAgIC8vIERlc3RydWN0dXJlIHNwZWNpYWwgY29uZmlncyBpbiBvbmUgb3BlcmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbGF5b3V0OiBsYXlvdXRDb25maWcsXG4gICAgICBsYXlvdXRJdGVtOiBsYXlvdXRJdGVtQ29uZmlnLFxuICAgICAgc3R5bGU6IHN0eWxlQ29uZmlnLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc0NvbmZpZyxcbiAgICAgIGV2ZW50czogZXZlbnRzQ29uZmlnLFxuICAgICAgZXZlbnQsIC8vIExlZ2FjeSBzdXBwb3J0XG4gICAgICAuLi5jbGVhbk9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFVzZSBldmVudHMgb3ZlciBldmVudCAoZXZlbnRzIGlzIHByZWZlcnJlZClcbiAgICBjb25zdCBmaW5hbEV2ZW50c0NvbmZpZyA9IGV2ZW50c0NvbmZpZyB8fCBldmVudDtcblxuICAgIC8vIElmIHN0eWxlIGlzIGEgc3RyaW5nLCBhbHdheXMgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnRcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjbGVhbk9wdGlvbnMuc3R5bGUgPSBzdHlsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29uc3QgaXNDbGFzcyA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ29tcG9uZW50LCBcInByb3RvdHlwZVwiKT8ud3JpdGFibGUgPT09XG4gICAgICAgIGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gaXNDbGFzc1xuICAgICAgPyBuZXcgQ29tcG9uZW50KGNsZWFuT3B0aW9ucylcbiAgICAgIDogQ29tcG9uZW50KGNsZWFuT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9ucyBpZiBjb21wb25lbnQgaGFzIGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29tcG9uZW50IDogbnVsbCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyBBcHBseSBsYXlvdXQgY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0Q29uZmlnKSBhcHBseUxheW91dENsYXNzZXMoZWxlbWVudCwgbGF5b3V0Q29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBsYXlvdXQgaXRlbSBjbGFzc2VzXG4gICAgICAgIGlmIChsYXlvdXRJdGVtQ29uZmlnKSBhcHBseUxheW91dEl0ZW1DbGFzc2VzKGVsZW1lbnQsIGxheW91dEl0ZW1Db25maWcpO1xuXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlXG4gICAgICAgIGlmIChzdHlsZUNvbmZpZyAmJiB0eXBlb2Ygc3R5bGVDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZXNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBldmVudHNcbiAgICAgICAgaWYgKGZpbmFsRXZlbnRzQ29uZmlnICYmIHR5cGVvZiBmaW5hbEV2ZW50c0NvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbmFsRXZlbnRzQ29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBldmVudERlZiBvZiBmaW5hbEV2ZW50c0NvbmZpZykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudERlZikgJiYgZXZlbnREZWYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSA9IGV2ZW50RGVmO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudE5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICBmaW5hbEV2ZW50c0NvbmZpZyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVHUkFURUQgTEFZT1VUIENPTkZJR1VSQVRJT04gKHdpdGggY2FjaGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0Q2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0Q29uZmlnKSByZXR1cm47XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUpIHtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRDb25maWcudHlwZX1gKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHByb3BlcnRpZXMgd2l0aCBjYWNoaW5nXG4gIGNvbnN0IGxheW91dFR5cGUgPSBsYXlvdXRDb25maWcudHlwZSB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpO1xuICBpZiAobGF5b3V0VHlwZSkge1xuICAgIGlmIChsYXlvdXRDb25maWcuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJnYXBcIiwgbGF5b3V0Q29uZmlnLmdhcCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmFsaWduKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiYWxpZ25cIiwgbGF5b3V0Q29uZmlnLmFsaWduKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuanVzdGlmeSkge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImp1c3RpZnlcIiwgbGF5b3V0Q29uZmlnLmp1c3RpZnkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmlkLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcImdyaWRcIiB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpID09PSBcImdyaWRcIikge1xuICAgIGlmICh0eXBlb2YgbGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUoXCJncmlkXCIsIFwiY29sc1wiLCBsYXlvdXRDb25maWcuY29sdW1ucyksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwiYXV0by1maWxsXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImZpbGxcIiwgXCJhdXRvXCIpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZml0XCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgXCJhdXRvLWZpdFwiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuZGVuc2UpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1kZW5zZWApO1xuICAgIGlmIChsYXlvdXRDb25maWcuYXV0b0hlaWdodClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkLWF1dG8taGVpZ2h0YCk7XG4gIH1cblxuICAvLyBSb3ctc3BlY2lmaWMgcHJvcGVydGllc1xuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUgPT09IFwicm93XCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJyb3dcIikge1xuICAgIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gZmFsc2UgfHwgbGF5b3V0Q29uZmlnLndyYXAgPT09IFwibm93cmFwXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbm93cmFwYCk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctd3JhcC1yZXZlcnNlYCk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU3RhY2spXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW1vYmlsZS1zdGFja2ApO1xuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU2Nyb2xsKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc2Nyb2xsYCk7XG4gIH1cblxuICAvLyBDdXN0b20gY2xhc3Nlc1xuICBpZiAobGF5b3V0Q29uZmlnLmNsYXNzKSB7XG4gICAgbGF5b3V0Q29uZmlnLmNsYXNzXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZm9yRWFjaCgoY2xzKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBpdGVtIGNsYXNzZXMgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICogVXNlcyBpbnRlZ3JhdGVkIGNhY2hpbmcgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWcsXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFpdGVtQ29uZmlnKSByZXR1cm47XG5cbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW1gKTtcblxuICAvLyBXaWR0aCBhbmQgcmVzcG9uc2l2ZSBjbGFzc2VzIHdpdGggY2FjaGluZ1xuICBpZiAoaXRlbUNvbmZpZy53aWR0aCAmJiBpdGVtQ29uZmlnLndpZHRoID49IDEgJiYgaXRlbUNvbmZpZy53aWR0aCA8PSAxMikge1xuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwiXCIsIGl0ZW1Db25maWcud2lkdGgpLFxuICAgICk7XG4gIH1cbiAgaWYgKGl0ZW1Db25maWcuc20pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzbVwiLCBpdGVtQ29uZmlnLnNtKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5tZClcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm1kXCIsIGl0ZW1Db25maWcubWQpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmxnKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwibGdcIiwgaXRlbUNvbmZpZy5sZyksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcueGwpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJ4bFwiLCBpdGVtQ29uZmlnLnhsKSxcbiAgICApO1xuXG4gIC8vIEdyaWQgc3BhbiBjbGFzc2VzXG4gIGlmIChpdGVtQ29uZmlnLnNwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzcGFuXCIsIGl0ZW1Db25maWcuc3BhbiksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcucm93U3BhbilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcInJvdy1zcGFuXCIsIGl0ZW1Db25maWcucm93U3BhbiksXG4gICAgKTtcblxuICAvLyBPcmRlciBhbmQgYWxpZ25tZW50XG4gIGlmIChpdGVtQ29uZmlnLm9yZGVyKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwib3JkZXJcIiwgaXRlbUNvbmZpZy5vcmRlciksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcuYWxpZ24pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzZWxmXCIsIGl0ZW1Db25maWcuYWxpZ24pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmF1dG8pXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW0tLWF1dG9gKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgICAgPyBcInJvd1wiXG4gICAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICAgICAgPyBcImdyaWRcIlxuICAgICAgICA6IFwiXCI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgU0NIRU1BIFBST0NFU1NPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYXJyYXktYmFzZWQgc2NoZW1hIGRlZmluaXRpb25zXG4gKiBPcHRpbWl6ZWQgd2l0aCBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBhbmQgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBcnJheVNjaGVtYShcbiAgc2NoZW1hOiBTY2hlbWFJdGVtW10gfCBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIGxldmVsOiBudW1iZXIgPSAwLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBsZXZlbCsrO1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgY29tcG9uZW50czogQXJyYXk8W3N0cmluZywgYW55XT4gPSBbXTtcbiAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICBsZXQgY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gKG9wdGlvbnMgYXMgYW55KS5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc2NoZW1hW2ldO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAvLyBIYW5kbGUgbmVzdGVkIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQgfHwgcGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NBcnJheVNjaGVtYShpdGVtLCBjb250YWluZXIsIGxldmVsLCBvcHRpb25zKTtcbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBjb21wb25lbnRzIGFycmF5IGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5sYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKC4uLnJlc3VsdC5sYXlvdXQuY29tcG9uZW50cyk7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubGF5b3V0LmNvbXBvbmVudHM7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgcmVzdWx0LmxheW91dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uXG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRvcixcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zOiBpdGVtT3B0aW9ucyxcbiAgICAgIGNvbnN1bWVkLFxuICAgIH0gPSBleHRyYWN0UGFyYW1ldGVycyhzY2hlbWEsIGksIGRlZmF1bHRDcmVhdG9yKTtcblxuICAgIGlmICghY3JlYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiU2tpcHBpbmcgdW5zdXBwb3J0ZWQgaXRlbSB0eXBlOlwiLCBpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gZGl2IGZvciBjcmVhdGVFbGVtZW50XG4gICAgaWYgKGNyZWF0b3IgPT09IGNyZWF0ZUVsZW1lbnQgJiYgIShcInRhZ1wiIGluIGl0ZW1PcHRpb25zKSkge1xuICAgICAgaXRlbU9wdGlvbnMudGFnID0gXCJkaXZcIjtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGluZGV4IGJ5IGNvbnN1bWVkIGl0ZW1zIG1pbnVzIDEgKGxvb3AgaW5jcmVtZW50IGhhbmRsZXMgdGhlICsxKVxuICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuXG4gICAgLy8gUHJvY2VzcyBvcHRpb25zIHdpdGggcHJlZml4IC0gb3B0aW1pemVkIGRlY2lzaW9uIGxvZ2ljXG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBpdGVtT3B0aW9ucyA/IGl0ZW1PcHRpb25zLnByZWZpeCA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvY2VzcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBzaG91bGRBcHBseVByZWZpeCB8fCBpdGVtT3B0aW9ucy5yYXdDbGFzc1xuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGl0ZW1PcHRpb25zLCAhc2hvdWxkQXBwbHlQcmVmaXgpXG4gICAgICAgIDogaXRlbU9wdGlvbnM7IC8vIE5vIGNvcHkgbmVlZGVkIGlmIG5vIHByb2Nlc3NpbmdcblxuICAgIC8vIEFkZCBuYW1lIHRvIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgaWYgKFxuICAgICAgbmFtZSAmJlxuICAgICAgIShcIm5hbWVcIiBpbiBwcm9jZXNzZWRPcHRpb25zKSAmJlxuICAgICAgIShjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50IHx8IChjcmVhdG9yIGFzIGFueSkuaXNFbGVtZW50KVxuICAgICkge1xuICAgICAgcHJvY2Vzc2VkT3B0aW9ucy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY3JlYXRvciwgcHJvY2Vzc2VkT3B0aW9ucyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuZWxlbWVudCA6IGNvbXBvbmVudDtcblxuICAgIGlmIChsZXZlbCA9PT0gMSkgbGF5b3V0LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsYXlvdXRbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnRzLnB1c2goW25hbWUsIGNvbXBvbmVudF0pO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCB0byBET01cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBpZiAoXCJpbnNlcnRcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb21wb25lbnQuaW5zZXJ0KGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuX2NvbnRhaW5lciA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9uSW5zZXJ0ZWRcIiBpbiBjb21wb25lbnQgJiZcbiAgICAgICAgICB0eXBlb2YgY29tcG9uZW50Lm9uSW5zZXJ0ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb21wb25lbnQub25JbnNlcnRlZChwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGVuZCBmcmFnbWVudCB0byBwYXJlbnRcbiAgaWYgKHBhcmVudEVsZW1lbnQgJiYgZnJhZ21lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gUmVsZWFzZSBmcmFnbWVudCBiYWNrIHRvIHBvb2xcbiAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcblxuICBsYXlvdXQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgb2JqZWN0LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogU2ltcGxpZmllZCBhbmQgb3B0aW1pemVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdENyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3IgfHwgY3JlYXRlRWxlbWVudDtcblxuICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50IGNyZWF0aW9uXG4gIGlmICgoc2NoZW1hIGFzIGFueSkuZWxlbWVudCAmJiAhcGFyZW50RWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnREZWYgPSAoc2NoZW1hIGFzIGFueSkuZWxlbWVudDtcbiAgICBjb25zdCBjcmVhdGVFbGVtZW50Rm4gPSBlbGVtZW50RGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG5cbiAgICBjb25zdCBlbGVtZW50T3B0aW9ucyA9IGVsZW1lbnREZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID1cbiAgICAgIG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZVxuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGVsZW1lbnRPcHRpb25zKVxuICAgICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGNyZWF0ZUVsZW1lbnRGbixcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMsXG4gICAgKTtcbiAgICBsYXlvdXQuZWxlbWVudCA9IHJvb3RDb21wb25lbnQ7XG4gICAgaWYgKGVsZW1lbnREZWYubmFtZSkgbGF5b3V0W2VsZW1lbnREZWYubmFtZV0gPSByb290Q29tcG9uZW50O1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChlbGVtZW50RGVmLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGlzQ29tcG9uZW50KHJvb3RDb21wb25lbnQpXG4gICAgICAgID8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIDogcm9vdENvbXBvbmVudDtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgICAgICAgZWxlbWVudERlZi5jaGlsZHJlbixcbiAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBub3JtYWwgc2NoZW1hIGVsZW1lbnRzXG4gIGNvbnN0IGZyYWdtZW50ID0gcGFyZW50RWxlbWVudCA/IGNyZWF0ZUZyYWdtZW50KCkgOiBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgZGVmID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgIGlmICghZGVmKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcmVhdG9yID0gZGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBkZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaG91bGRBcHBseVByZWZpeCA9XG4gICAgICBcInByZWZpeFwiIGluIGVsZW1lbnRPcHRpb25zXG4gICAgICAgID8gZWxlbWVudE9wdGlvbnMucHJlZml4XG4gICAgICAgIDogb3B0aW9ucy5wcmVmaXggIT09IGZhbHNlO1xuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPSBzaG91bGRBcHBseVByZWZpeFxuICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgIDogeyAuLi5lbGVtZW50T3B0aW9ucyB9O1xuXG4gICAgaWYgKCFkZWYubmFtZSAmJiBrZXkgIT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBkZWYubmFtZSA9IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoZWxlbWVudENyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGxheW91dFtrZXldID0gY3JlYXRlZDtcbiAgICBpZiAoZGVmLm5hbWUgJiYgZGVmLm5hbWUgIT09IGtleSkgbGF5b3V0W2RlZi5uYW1lXSA9IGNyZWF0ZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQoY3JlYXRlZCkgPyBjcmVhdGVkLmVsZW1lbnQgOiBjcmVhdGVkO1xuICAgIGlmIChmcmFnbWVudCkgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgaWYgKGRlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBwcm9jZXNzT2JqZWN0U2NoZW1hKGRlZi5jaGlsZHJlbiwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgY2hpbGRSZXN1bHQubGF5b3V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RG9tID0gaXNDb21wb25lbnQocGFyZW50RWxlbWVudClcbiAgICAgID8gcGFyZW50RWxlbWVudC5lbGVtZW50XG4gICAgICA6IHBhcmVudEVsZW1lbnQ7XG4gICAgcGFyZW50RG9tLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMQVlPVVQgUkVTVUxUIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmxhdHRlbnMgYSBuZXN0ZWQgbGF5b3V0IGludG8gYSBzaW1wbGUgb2JqZWN0IHdpdGggZWxlbWVudCBhbmQgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkxheW91dChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgZmxhdHRlbmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFsYXlvdXQgfHwgdHlwZW9mIGxheW91dCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZsYXR0ZW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxheW91dFtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgKHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgfHxcbiAgICAgICAgaXNDb21wb25lbnQodmFsdWUpKVxuICAgICkge1xuICAgICAgZmxhdHRlbmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgcmVzdWx0IG9iamVjdCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBmbGF0dGVuZWRDb21wb25lbnRzID0gZmxhdHRlbkxheW91dChsYXlvdXQpO1xuXG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGVsZW1lbnQ6IGxheW91dC5lbGVtZW50LFxuICAgIGNvbXBvbmVudDogZmxhdHRlbmVkQ29tcG9uZW50cyxcblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGxheW91dFtuYW1lXSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkQ29tcG9uZW50cztcbiAgICB9LFxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIC8vIFRyYWNrIGRlc3Ryb3llZCBjb21wb25lbnRzIHRvIGF2b2lkIGRvdWJsZS1kZXN0cm95XG4gICAgICBjb25zdCBkZXN0cm95ZWQgPSBuZXcgU2V0PGFueT4oKTtcblxuICAgICAgLy8gSGVscGVyIHRvIHNhZmVseSBkZXN0cm95IGEgY29tcG9uZW50XG4gICAgICBjb25zdCBkZXN0cm95Q29tcG9uZW50ID0gKGNvbXBvbmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGRlc3Ryb3llZC5oYXMoY29tcG9uZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNraXAgcGxhaW4gSFRNTCBlbGVtZW50cyBhbmQgbm9uLW9iamVjdHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHR5cGVvZiBjb21wb25lbnQgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgd2l0aCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXN0cm95ZWQuYWRkKGNvbXBvbmVudCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gY29tcG9uZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGRlc3Ryb3kgY29tcG9uZW50cyBmcm9tIHRoZSBjb21wb25lbnRzIGFycmF5IChpZiBwcmVzZW50KVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBuYW1lZCBjb21wb25lbnRzIGFyZSBkZXN0cm95ZWQgZXZlbiBpZiBuZXN0ZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIGxheW91dC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gaXRlcmF0ZSBvdmVyIGFsbCBsYXlvdXQga2V5cyBmb3IgYW55IG1pc3NlZCBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJlbGVtZW50XCIgfHwga2V5ID09PSBcImNvbXBvbmVudHNcIikgY29udGludWU7XG4gICAgICAgIGRlc3Ryb3lDb21wb25lbnQobGF5b3V0W2tleV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSByb290IGVsZW1lbnQgZnJvbSBET01cbiAgICAgIGlmIChsYXlvdXQuZWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQobGF5b3V0LmVsZW1lbnQpXG4gICAgICAgICAgPyBsYXlvdXQuZWxlbWVudC5lbGVtZW50XG4gICAgICAgICAgOiBsYXlvdXQuZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHJlZmVyZW5jZXMgdG8gaGVscCBHQ1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGRlbGV0ZSBsYXlvdXRba2V5XTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIEVOVFJZIFBPSU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxheW91dCBmcm9tIHZhcmlvdXMgc2NoZW1hIGZvcm1hdHNcbiAqIFVuaWZpZWQgcHJvY2Vzc29yIGZvciBhcnJheXMsIG9iamVjdHMsIEpTWCwgYW5kIEhUTUwgc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICBzY2hlbWE6IGFueSxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gSGFuZGxlIGZ1bmN0aW9uIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIEhUTUwgc3RyaW5nIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzY2hlbWEudHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGVtcGxhdGUuY29udGVudDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0geyBlbGVtZW50OiBmcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB9O1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBKU1gtbGlrZSBzY2hlbWFzIChhcnJheSB3aXRoIGZ1bmN0aW9uLCBzdHJpbmcsIG9iamVjdCBwYXR0ZXJuKVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgc2NoZW1hLmxlbmd0aCA+PSAzICYmXG4gICAgdHlwZW9mIHNjaGVtYVswXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHNjaGVtYVsxXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYVsyXSlcbiAgKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcHJvY2Vzc29yXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICA/IHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpXG4gICAgOiBwcm9jZXNzT2JqZWN0U2NoZW1hKHNjaGVtYSwgcGFyZW50RWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xlYXIgZnVuY3Rpb25zIGZvciB0aGUgdW5pZmllZCBzeXN0ZW1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNsYXNzQ2FjaGUoKTogdm9pZCB7XG4gIGNsYXNzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRnJhZ21lbnRQb29sKCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvY2Vzc0NsYXNzTmFtZXMsXG4gIGlzQ29tcG9uZW50LFxuICBmbGF0dGVuTGF5b3V0LFxuICBhcHBseUxheW91dENsYXNzZXMsXG4gIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMsXG4gIGNyZWF0ZUxheW91dFJlc3VsdCxcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9jb25maWdcbiAqIEBkZXNjcmlwdGlvbiBFc3NlbnRpYWwgbGF5b3V0IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzXG4gKiBDb3JlIGZ1bmN0aW9uYWxpdHkgaXMgaW50ZWdyYXRlZCBpbnRvIHNjaGVtYS50cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlIGZyb20gbWFpbiBtdHJsIGNvbmZpZ1xuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBTaW1wbGUgRE9NIHV0aWxpdGllc1xuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlbGVtZW50ICYmIGNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQ6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gdXAgcHJldmlvdXMgbGF5b3V0IGNsYXNzZXMgZnJvbSBhbiBlbGVtZW50XG4gKiBVc2VmdWwgZm9yIGR5bmFtaWMgY2xhc3MgbWFuYWdlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjbGVhbiBsYXlvdXQgY2xhc3NlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwTGF5b3V0Q2xhc3NlcyhlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmNsYXNzTGlzdCkgcmV0dXJuO1xuXG4gIC8vIEdldCBhbGwgY2xhc3NlcyBmcm9tIHRoZSBlbGVtZW50XG4gIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpIGFzIHN0cmluZ1tdO1xuXG4gIC8vIEZpbmQgYW5kIHJlbW92ZSBsYXlvdXQtcmVsYXRlZCBjbGFzc2VzXG4gIGNvbnN0IGxheW91dENsYXNzZXMgPSBjbGFzc0xpc3QuZmlsdGVyKFxuICAgIChjbHM6IHN0cmluZykgPT5cbiAgICAgIGNscy5zdGFydHNXaXRoKGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1gKSB8fFxuICAgICAgY2xzLmluY2x1ZGVzKGAtJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYClcbiAgKTtcblxuICAvLyBSZW1vdmUgZWFjaCBsYXlvdXQgY2xhc3NcbiAgbGF5b3V0Q2xhc3Nlcy5mb3JFYWNoKChjbHM6IHN0cmluZykgPT4ge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgTGF5b3V0IHR5cGUgaWYgZm91bmQsIGVtcHR5IHN0cmluZyBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFR5cGUoZWxlbWVudDogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgID8gXCJyb3dcIlxuICAgIDogaGFzQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWRgKVxuICAgID8gXCJncmlkXCJcbiAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBwcmVmaXggZm9yIHRoZSBsYXlvdXQgc3lzdGVtXG4gKiBAcmV0dXJucyBDdXJyZW50IHByZWZpeCB3aXRoIGRhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFByZWZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gUFJFRklYX1dJVEhfREFTSDtcbn1cblxuLyoqXG4gKiBTZXRzIGxheW91dCBjbGFzc2VzIG9uIGFuIGVsZW1lbnQgZHluYW1pY2FsbHlcbiAqIFVzZWZ1bCBmb3IgcHJvZ3JhbW1hdGljIGxheW91dCB1cGRhdGVzXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudFxuICogQHBhcmFtIGxheW91dFR5cGUgLSBMYXlvdXQgdHlwZSB0byBhcHBseVxuICogQHBhcmFtIGNsYXNzZXMgLSBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IGFueSxcbiAgbGF5b3V0VHlwZTogc3RyaW5nLFxuICBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFsYXlvdXRUeXBlKSByZXR1cm47XG5cbiAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgbGF5b3V0IGNsYXNzZXMgZmlyc3RcbiAgY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudCk7XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRUeXBlfWApO1xuXG4gIC8vIEFwcGx5IGFkZGl0aW9uYWwgY2xhc3Nlc1xuICBjbGFzc2VzLmZvckVhY2goKGNscykgPT4ge1xuICAgIGlmIChjbHMuc3RhcnRzV2l0aChcImxheW91dC0tXCIpIHx8IGNscy5zdGFydHNXaXRoKFwibGF5b3V0X19cIikpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9JHtjbHN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGNscyk7XG4gICAgfVxuICB9KTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbW9kdWxlIGNvcmUvbGF5b3V0L2pzeFxuICogQGRlc2NyaXB0aW9uIEpTWC1saWtlIHN5bnRheCBzdXBwb3J0IGZvciBsYXlvdXQgY3JlYXRpb25cbiAqIFByb3ZpZGVzIGEgc2ltcGxlIGgoKSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgZWxlbWVudHMgd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMYXlvdXRSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5cbi8qKlxuICogRnJhZ21lbnQgc3ltYm9sIGZvciBKU1ggZnJhZ21lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBGcmFnbWVudCA9IFN5bWJvbChcIkZyYWdtZW50XCIpO1xuXG4vKipcbiAqIEpTWC1saWtlIGh5cGVyc2NyaXB0IGZ1bmN0aW9uXG4gKiBDcmVhdGVzIGVsZW1lbnRzIGluIGEgUmVhY3QtbGlrZSBzeW50YXggd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKlxuICogQHBhcmFtIHRhZyAtIEhUTUwgdGFnIG5hbWUsIGNvbXBvbmVudCBmdW5jdGlvbiwgb3IgRnJhZ21lbnRcbiAqIEBwYXJhbSBwcm9wcyAtIEVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlc1xuICogQHBhcmFtIGNoaWxkcmVuIC0gQ2hpbGQgZWxlbWVudHNcbiAqIEByZXR1cm5zIERPTSBlbGVtZW50IG9yIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaChcbiAgdGFnOiBzdHJpbmcgfCBGdW5jdGlvbiB8IHR5cGVvZiBGcmFnbWVudCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCxcbiAgLi4uY2hpbGRyZW46IGFueVtdXG4pOiBhbnkge1xuICAvLyBIYW5kbGUgRnJhZ21lbnRcbiAgaWYgKHRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgICAgdHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQ7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJpbmcgdGFncyAoSFRNTCBlbGVtZW50cylcbiAgaWYgKHR5cGVvZiB0YWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gICAgLy8gQXBwbHkgcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcImNsYXNzTmFtZVwiIHx8IGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChcIm9uXCIpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gRXZlbnQgaGFuZGxlclxuICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAvLyBTdHlsZSBvYmplY3RcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIikge1xuICAgICAgICAgIC8vIEhUTUwgY29udGVudFxuICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWUuX19odG1sIHx8IFwiXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlZ3VsYXIgYXR0cmlidXRlXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGVuZCBjaGlsZHJlblxuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNoaWxkKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb21wb25lbnQgZnVuY3Rpb25zXG4gIGlmICh0eXBlb2YgdGFnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBhbGxQcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBhbGxQcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGFnKGFsbFByb3BzKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGRpdlxuICByZXR1cm4gaChcImRpdlwiLCBwcm9wcywgLi4uY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgdXNpbmcgSlNYLWxpa2Ugc3ludGF4XG4gKiBQcm92aWRlcyBhIGJyaWRnZSBiZXR3ZWVuIEpTWCBhbmQgdGhlIGxheW91dCBzeXN0ZW1cbiAqXG4gKiBAcGFyYW0ganN4RWxlbWVudCAtIEpTWCBlbGVtZW50IGNyZWF0ZWQgd2l0aCBoKClcbiAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gUGFyZW50IGVsZW1lbnQgdG8gYXR0YWNoIHRvXG4gKiBAcmV0dXJucyBMYXlvdXQgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKc3hMYXlvdXQoXG4gIGpzeEVsZW1lbnQ6IGFueSxcbiAgcGFyZW50RWxlbWVudD86IGFueVxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gQ29udmVydCBKU1ggZWxlbWVudCB0byBsYXlvdXQgc2NoZW1hXG4gIGNvbnN0IHNjaGVtYSA9IGpzeEVsZW1lbnQ7XG5cbiAgLy8gQ3JlYXRlIGxheW91dCB1c2luZyB0aGUgc3RhbmRhcmQgY3JlYXRlTGF5b3V0IGZ1bmN0aW9uXG4gIHJldHVybiBjcmVhdGVMYXlvdXQoc2NoZW1hLCBwYXJlbnRFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIHNpbXBsZSBjb21wb25lbnQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIHJldXNhYmxlIEpTWCBjb21wb25lbnRzXG4gKlxuICogQHBhcmFtIGZuIC0gQ29tcG9uZW50IGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCBpbiBKU1hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudChmbjogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkpOiBGdW5jdGlvbiB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICAgIHJldHVybiBmbihwcm9wcyB8fCB7fSk7XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byByZW5kZXIgbXVsdGlwbGUgSlNYIGVsZW1lbnRzXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIGxpc3RzIG9yIGNvbGxlY3Rpb25zXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gQXJyYXkgb2YgSlNYIGVsZW1lbnRzXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgQXJyYXkgb2YgbGF5b3V0IHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVsZW1lbnRzKFxuICBlbGVtZW50czogYW55W10sXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdFtdIHtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gY3JlYXRlSnN4TGF5b3V0KGVsZW1lbnQsIHBhcmVudEVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBDb21tb24gSlNYIGVsZW1lbnQgY3JlYXRvcnMgZm9yIGNvbnZlbmllbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBqc3ggPSB7XG4gIGRpdjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc3BhbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzcGFuXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHA6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwicFwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBidXR0b246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYnV0dG9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGlucHV0OiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW5wdXRcIiwgcHJvcHMpLFxuICBpbWc6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGgoXCJpbWdcIiwgcHJvcHMpLFxuICBhOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImFcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgdWw6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwidWxcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbGk6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwibGlcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc2VjdGlvbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzZWN0aW9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGhlYWRlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJoZWFkZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgZm9vdGVyOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImZvb3RlclwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBtYWluOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcIm1haW5cIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYXJ0aWNsZTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhcnRpY2xlXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG59O1xuIiwKICAgICIvKipcbiAqIFZpZXdwb3J0IC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBlbmdpbmVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZpZXdwb3J0Q29uZmlnLFxuICBWaWV3cG9ydENvbnRleHQsXG4gIFZpZXdwb3J0Q29tcG9uZW50LFxuICBJdGVtUmFuZ2UsXG4gIFZpZXdwb3J0SW5mbyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEJhc2UgfSBmcm9tIFwiLi9mZWF0dXJlcy9iYXNlXCI7XG5pbXBvcnQgeyB3aXRoVmlydHVhbCB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZpcnR1YWxcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxiYXIgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxiYXJcIjtcbmltcG9ydCB7IHdpdGhDb2xsZWN0aW9uIH0gZnJvbSBcIi4vZmVhdHVyZXMvY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aFBsYWNlaG9sZGVycyB9IGZyb20gXCIuL2ZlYXR1cmVzL3BsYWNlaG9sZGVyc1wiO1xuaW1wb3J0IHsgd2l0aFJlbmRlcmluZyB9IGZyb20gXCIuL2ZlYXR1cmVzL3JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cyB9IGZyb20gXCIuL2ZlYXR1cmVzL2V2ZW50c1wiO1xuXG4vLyBJbnRlcm5hbCB2aWV3cG9ydCBzdGF0ZVxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IEl0ZW1SYW5nZTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgdmVsb2NpdHk6IG51bWJlcjtcbiAgc2Nyb2xsRGlyZWN0aW9uOiBcImZvcndhcmRcIiB8IFwiYmFja3dhcmRcIjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdmlld3BvcnQtZW5oYW5jZWQgY29tcG9uZW50IHVzaW5nIGNvbXBvc2l0aW9uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFZpZXdwb3J0IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCB2aWV3cG9ydCBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZpZXdwb3J0ID0gKGNvbmZpZzogVmlld3BvcnRDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQ+KGNvbXBvbmVudDogVCk6IFQgJiBWaWV3cG9ydENvbXBvbmVudCA9PiB7XG4gICAgLy8gVHJhY2sgaWYgdmlld3BvcnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gcHJldmVudCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbnNcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgLy8gTm8gbm9ybWFsaXphdGlvbiBuZWVkZWQgLSB3ZSdsbCB1c2UgdGhlIG5lc3RlZCBzdHJ1Y3R1cmUgZGlyZWN0bHlcblxuICAgIC8vIENyZWF0ZSBzaGFyZWQgdmlld3BvcnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZTogVmlld3BvcnRTdGF0ZSA9IHtcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiAwLFxuICAgICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMgfHwgMCxcbiAgICAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUgfHwgNTAsXG4gICAgICBjb250YWluZXJTaXplOiAwLFxuICAgICAgdmlydHVhbFRvdGFsU2l6ZTogMCxcbiAgICAgIHZpc2libGVSYW5nZTogeyBzdGFydDogMCwgZW5kOiAwIH0sXG4gICAgICBpdGVtc0NvbnRhaW5lcjogbnVsbCxcbiAgICAgIHZlbG9jaXR5OiAwLFxuICAgICAgc2Nyb2xsRGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGJhc2Ugdmlld3BvcnQgQVBJXG4gICAgY29uc3Qgdmlld3BvcnRBUEkgPSB7XG4gICAgICAvLyBDb3JlIEFQSVxuICAgICAgaW5pdGlhbGl6ZTogKCkgPT4ge1xuICAgICAgICAvLyBQcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbGl6aW5nIHdpdGggc3RhdGU6XCIsIHtcbiAgICAgICAgLy8gICBlbGVtZW50OiAhIWNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgICAvLyAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC50b3RhbEl0ZW1zLFxuICAgICAgICAvLyAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUsXG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgY29udGFpbmVyIHNpemVcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgc3RhdGUuY29udGFpbmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgICAgPyBjb21wb25lbnQuZWxlbWVudC5vZmZzZXRXaWR0aFxuICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBDb250YWluZXIgc2l6ZTpcIiwgc3RhdGUuY29udGFpbmVyU2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgaW5pdGlhbCB2aXJ0dWFsIHNpemVcbiAgICAgICAgc3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IHN0YXRlLnRvdGFsSXRlbXMgKiBzdGF0ZS5pdGVtU2l6ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgaW5pdGlhbCB2aXNpYmxlIHJhbmdlXG4gICAgICAgIHN0YXRlLnZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZVZpc2libGVSYW5nZShzdGF0ZS5zY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIEluaXRpYWwgc3RhdGU6XCIsIHtcbiAgICAgICAgLy8gICBjb250YWluZXJTaXplOiBzdGF0ZS5jb250YWluZXJTaXplLFxuICAgICAgICAvLyAgIHZpcnR1YWxUb3RhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIC8vICAgdmlzaWJsZVJhbmdlOiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIC8vIH0pO1xuICAgICAgfSxcblxuICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbnVwIHdpbGwgYmUgaGFuZGxlZCBieSBmZWF0dXJlc1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlVmlld3BvcnQ6ICgpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSByZW5kZXJpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaXNJbml0aWFsaXplZDogKCkgPT4gaXNJbml0aWFsaXplZCxcblxuICAgICAgLy8gQWxsb3cgZmVhdHVyZXMgdG8gY2hlY2sgaWYgaW5pdCBzaG91bGQgcHJvY2VlZFxuICAgICAgX3Nob3VsZEluaXQ6ICgpID0+ICFpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBTY3JvbGxpbmcgQVBJICh3aWxsIGJlIG92ZXJyaWRkZW4gYnkgc2Nyb2xsaW5nIGZlYXR1cmUpXG4gICAgICBzY3JvbGxUb0luZGV4OiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICAgKSA9PiB7XG4gICAgICAgIC8vIFBsYWNlaG9sZGVyIC0gd2lsbCBiZSBpbXBsZW1lbnRlZCBieSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbjogKHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuXG4gICAgICAvLyBJbmZvIEFQSVxuICAgICAgZ2V0VmlzaWJsZVJhbmdlOiAoKSA9PiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG5cbiAgICAgIGdldFZpZXdwb3J0SW5mbzogKCk6IFZpZXdwb3J0SW5mbyA9PiAoe1xuICAgICAgICBjb250YWluZXJTaXplOiBzdGF0ZS5jb250YWluZXJTaXplLFxuICAgICAgICB0b3RhbFZpcnR1YWxTaXplOiBzdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgdmlydHVhbFNjcm9sbFBvc2l0aW9uOiBzdGF0ZS5zY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pLFxuXG4gICAgICAvLyBSZW5kZXJpbmcgQVBJXG4gICAgICByZW5kZXJJdGVtczogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnRlcm5hbCBzdGF0ZSAoZm9yIGZlYXR1cmVzIHRvIGFjY2VzcylcbiAgICAgIHN0YXRlLFxuICAgIH07XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHZpc2libGUgcmFuZ2VcbiAgICBjb25zdCBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zOiBudW1iZXIpOiBJdGVtUmFuZ2UgPT4ge1xuICAgICAgY29uc3QgaXRlbVNpemUgPSBzdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3MgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoc3RhdGUuY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgdmlzaWJsZUNvdW50LCBzdGF0ZS50b3RhbEl0ZW1zIC0gMSk7XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0OiBNYXRoLm1heCgwLCBzdGFydCksIGVuZDogTWF0aC5tYXgoMCwgZW5kKSB9O1xuICAgIH07XG5cbiAgICAvLyBBZGQgdmlld3BvcnQgQVBJIHRvIGNvbXBvbmVudFxuICAgIGNvbnN0IGJhc2VDb21wb25lbnQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICB2aWV3cG9ydDogdmlld3BvcnRBUEksXG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIHRoZSBlbmhhbmNlbWVudCBwaXBlbGluZVxuICAgIGNvbnN0IGVuaGFuY2VyczogQXJyYXk8KGM6IGFueSkgPT4gYW55PiA9IFtdO1xuXG4gICAgLy8gRXZlbnRzIHN5c3RlbSAoYWx3YXlzIGZpcnN0IC0gcHJvdmlkZXMgY29tbXVuaWNhdGlvbiBmb3Igb3RoZXIgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoRXZlbnRzKHtcbiAgICAgICAgZGVidWc6IGNvbmZpZy5kZWJ1ZyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBCYXNlIHNldHVwIChjcmVhdGVzIERPTSBzdHJ1Y3R1cmUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoQmFzZSh7XG4gICAgICAgIGNsYXNzTmFtZTogY29uZmlnLmNsYXNzTmFtZSxcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFZpcnR1YWwgc2Nyb2xsaW5nIChyZXF1aXJlZCBmb3IgbW9zdCBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhWaXJ0dWFsKHtcbiAgICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgICBhdXRvRGV0ZWN0SXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5hdXRvRGV0ZWN0SXRlbVNpemUsXG4gICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogKGNvbmZpZyBhcyBhbnkpLmluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxpbmcgYmVoYXZpb3JcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIHNlbnNpdGl2aXR5OiBjb25maWcuc2Nyb2xsaW5nPy5zZW5zaXRpdml0eSxcbiAgICAgICAgc21vb3RoaW5nOiBjb25maWcuc2Nyb2xsaW5nPy5hbmltYXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gU2Nyb2xsYmFyIChvcHRpb25hbClcbiAgICBpZiAoY29uZmlnLnNjcm9sbGJhcj8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoU2Nyb2xsYmFyKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGF1dG9IaWRlOiBjb25maWcuc2Nyb2xsYmFyPy5hdXRvSGlkZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGlmIGNvbmZpZ3VyZWRcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoQ29sbGVjdGlvbih7XG4gICAgICAgICAgY29sbGVjdGlvbjogY29uZmlnLmNvbGxlY3Rpb24uYWRhcHRlcixcbiAgICAgICAgICByYW5nZVNpemU6IGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgICBzdHJhdGVneTogY29uZmlnLnBhZ2luYXRpb24/LnN0cmF0ZWd5IGFzXG4gICAgICAgICAgICB8IFwib2Zmc2V0XCJcbiAgICAgICAgICAgIHwgXCJwYWdlXCJcbiAgICAgICAgICAgIHwgXCJjdXJzb3JcIlxuICAgICAgICAgICAgfCB1bmRlZmluZWQsXG4gICAgICAgICAgdHJhbnNmb3JtOiBjb25maWcuY29sbGVjdGlvbj8udHJhbnNmb3JtLFxuICAgICAgICAgIGNhbmNlbExvYWRUaHJlc2hvbGQ6IGNvbmZpZy5wZXJmb3JtYW5jZT8uY2FuY2VsTG9hZFRocmVzaG9sZCxcbiAgICAgICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHM6IGNvbmZpZy5wZXJmb3JtYW5jZT8ubWF4Q29uY3VycmVudFJlcXVlc3RzLFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZTogY29uZmlnLnBlcmZvcm1hbmNlPy5lbmFibGVSZXF1ZXN0UXVldWUgIT09IGZhbHNlLFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogKGNvbmZpZyBhcyBhbnkpLmluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICBzZWxlY3RJZDogKGNvbmZpZyBhcyBhbnkpLnNlbGVjdElkLFxuICAgICAgICAgIGF1dG9Mb2FkOiAoY29uZmlnIGFzIGFueSkuYXV0b0xvYWQgIT09IGZhbHNlLFxuICAgICAgICAgIGF1dG9TZWxlY3RGaXJzdDogKGNvbmZpZyBhcyBhbnkpLmF1dG9TZWxlY3RGaXJzdCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBsYWNlaG9sZGVycyAob3B0aW9uYWwsIHJlcXVpcmVzIGNvbGxlY3Rpb24pXG4gICAgaWYgKGNvbmZpZy5jb2xsZWN0aW9uPy5hZGFwdGVyICYmIGNvbmZpZy5wbGFjZWhvbGRlcnM/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aFBsYWNlaG9sZGVycyh7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhbmFseXplRmlyc3RMb2FkOiBjb25maWcucGxhY2Vob2xkZXJzPy5hbmFseXplRmlyc3RMb2FkID8/IHRydWUsXG4gICAgICAgICAgbWFza0NoYXJhY3RlcjogY29uZmlnLnBsYWNlaG9sZGVycz8ubWFza0NoYXJhY3RlcixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlbmRlcmluZyAoYWx3YXlzIGxhc3QgdG8gaGF2ZSBhY2Nlc3MgdG8gYWxsIGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFJlbmRlcmluZyh7XG4gICAgICAgIHRlbXBsYXRlOiBjb25maWcudGVtcGxhdGUsXG4gICAgICAgIG92ZXJzY2FuOiBjb25maWcudmlydHVhbD8ub3ZlcnNjYW4sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQ29tcG9zZSBhbGwgZW5oYW5jZXJzXG4gICAgY29uc3QgZW5oYW5jZSA9IHBpcGUoLi4uZW5oYW5jZXJzKTtcblxuICAgIC8vIEFwcGx5IGVuaGFuY2VtZW50c1xuICAgIGNvbnN0IGVuaGFuY2VkID0gZW5oYW5jZShiYXNlQ29tcG9uZW50KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBpZiBlbGVtZW50IGlzIHByb3ZpZGVkXG4gICAgaWYgKGVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgIGVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZWQgYXMgVCAmIFZpZXdwb3J0Q29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvdXRpbHMudHNcblxuLyoqXG4gKiBTaGFyZWQgdXRpbGl0aWVzIGZvciB2aWV3cG9ydCBmZWF0dXJlc1xuICogRWxpbWluYXRlcyBjb2RlIGR1cGxpY2F0aW9uIGFjcm9zcyBmZWF0dXJlc1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIFdyYXBzIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uIHdpdGggZmVhdHVyZS1zcGVjaWZpYyBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgaW5pdGlhbGl6YXRpb24gaG9vayBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5pdGlhbGl6ZTxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICBjb21wb25lbnQ6IFQsXG4gIGZlYXR1cmVJbml0OiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IG9yaWdpbmFsSW5pdGlhbGl6ZSA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkIChyZXR1cm5zIGZhbHNlIGlmIGFscmVhZHkgZG9uZSlcbiAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAvLyBPbmx5IHJ1biBmZWF0dXJlIGluaXQgaWYgYmFzZSBpbml0IGFjdHVhbGx5IHJhbiAoZGlkbid0IHJldHVybiBmYWxzZSlcbiAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgZmVhdHVyZUluaXQoKTtcbiAgICB9XG4gICAgLy8gUHJvcGFnYXRlIHRoZSByZXN1bHQgdGhyb3VnaCB0aGUgY2hhaW4gc28gb3V0ZXIgd3JhcHBlcnMga25vdyB0byBza2lwXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBjb21wb25lbnQgZGVzdHJveSB3aXRoIGNsZWFudXAgbG9naWNcbiAqIEVsaW1pbmF0ZXMgdGhlIHJlcGVhdGVkIGRlc3Ryb3kgaG9vayBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwRGVzdHJveTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIGNvbXBvbmVudDogVCxcbiAgY2xlYW51cDogKCkgPT4gdm9pZCxcbik6IHZvaWQge1xuICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHZpZXdwb3J0IHN0YXRlIHdpdGggcHJvcGVyIHR5cGluZ1xuICogRWxpbWluYXRlcyByZXBlYXRlZCAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50OiBWaWV3cG9ydENvbXBvbmVudCk6IGFueSB7XG4gIHJldHVybiAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICogRWxpbWluYXRlcyBkdXBsaWNhdGVkIHBsYWNlaG9sZGVyIGRldGVjdGlvbiBsb2dpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFjZWhvbGRlcihpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpdGVtICYmXG4gICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAoaXRlbS5fcGxhY2Vob2xkZXIgPT09IHRydWUgfHwgaXRlbVtcIl9wbGFjZWhvbGRlclwiXSA9PT0gdHJ1ZSkgLy8gU3VwcG9ydCBib3RoIGFjY2VzcyBwYXR0ZXJuc1xuICApO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByYW5nZSBrZXkgZm9yIGRlZHVwbGljYXRpb25cbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIHRyYWNraW5nIHJhbmdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZ2VLZXkocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtyYW5nZS5zdGFydH0tJHtyYW5nZS5lbmR9YDtcbn1cblxuLyoqXG4gKiBDbGFtcHMgYSB2YWx1ZSBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4gKiBVc2VkIGJ5IG11bHRpcGxlIGZlYXR1cmVzIGZvciBib3VuZGFyeSBjaGVja2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFN0b3JlcyBhIGZ1bmN0aW9uIHJlZmVyZW5jZSBvbiB0aGUgY29tcG9uZW50IGZvciBsYXRlciBhY2Nlc3NcbiAqIEVsaW1pbmF0ZXMgcGF0dGVybiBsaWtlIChjb21wb25lbnQgYXMgYW55KS5fZmVhdHVyZUZ1bmN0aW9uID0gZm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlRmVhdHVyZUZ1bmN0aW9uPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBGdW5jdGlvbixcbik6IHZvaWQge1xuICAoY29tcG9uZW50IGFzIGFueSlbbmFtZV0gPSBmbjtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvYmFzZS50c1xuXG4vKipcbiAqIEJhc2UgVmlld3BvcnQgRmVhdHVyZSAtIFNldHMgdXAgY29yZSB2aWV3cG9ydCBzdHJ1Y3R1cmVcbiAqIFByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBvdGhlciB2aWV3cG9ydCBmZWF0dXJlc1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VDb25maWcge1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIG9yaWVudGF0aW9uPzogXCJ2ZXJ0aWNhbFwiIHwgXCJob3Jpem9udGFsXCI7XG59XG5cbi8qKlxuICogQmFzZSBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogU2V0cyB1cCB0aGUgRE9NIHN0cnVjdHVyZSBhbmQgY29yZSBzdHlsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXNlID0gKGNvbmZpZzogQmFzZUNvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7IGNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydFwiLCBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIiB9ID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHRoZSBzaGFyZWQgd3JhcHBlciB1dGlsaXR5XG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gQ3JlYXRlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICAgICAgbGV0IHZpZXdwb3J0RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIubXRybC12aWV3cG9ydFwiXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICBpZiAoIXZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGA7XG5cbiAgICAgICAgLy8gU2V0IG9yaWVudGF0aW9uXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLW9yaWVudGF0aW9uXCIsIG9yaWVudGF0aW9uKTtcblxuICAgICAgICAvLyBDcmVhdGUgaXRlbXMgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGl0ZW1zQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgaXRlbXNDb250YWluZXIuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1zXCI7XG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBgO1xuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZChpdGVtc0NvbnRhaW5lcik7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodmlld3BvcnRFbGVtZW50KTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGUgd2l0aCBjb250YWluZXJzIHVzaW5nIHV0aWxpdHlcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCk7XG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIHN0YXRlLnZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgICBzdGF0ZS5pdGVtc0NvbnRhaW5lciA9IGl0ZW1zQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlcyBvbiBjb21wb25lbnRcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzXG5cbi8qKlxuICogVmlld3BvcnQgQ29uc3RhbnRzXG4gKiBDZW50cmFsaXplZCBjb25zdGFudHMgZm9yIGFsbCB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5XG4gKiBDb25zb2xpZGF0ZWQgZnJvbSB2aWV3cG9ydCwgdmlld3BvcnQvZmVhdHVyZXMsIGFuZCBsaXN0LW1hbmFnZXIgY29uc3RhbnRzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFZJRVdQT1JUX0NPTlNUQU5UUyA9IHtcbiAgLy8gVmlydHVhbCBzY3JvbGxpbmcgZGVmYXVsdHNcbiAgVklSVFVBTF9TQ1JPTEw6IHtcbiAgICBERUZBVUxUX0lURU1fU0laRTogNDgsXG4gICAgT1ZFUlNDQU5fQlVGRkVSOiAyLFxuICAgIFNDUk9MTF9TRU5TSVRJVklUWTogMC43LFxuICAgIE1BWF9WSVJUVUFMX1NJWkU6IDEwMCAqIDEwMDAgKiAxMDAwLCAvLyAxMDBNIHBpeGVscyAtIG1vZGVybiBicm93c2VycyBjYW4gaGFuZGxlIHRoaXNcbiAgICBBVVRPX0RFVEVDVF9JVEVNX1NJWkU6IHRydWUsIC8vIEVuYWJsZSBhdXRvbWF0aWMgaXRlbSBzaXplIGRldGVjdGlvblxuICB9LFxuXG4gIC8vIFNjcm9sbGluZyBzZXR0aW5nc1xuICBTQ1JPTExJTkc6IHtcbiAgICBPVkVSU0NBTjogMSwgLy8gRnJvbSBmZWF0dXJlcy9jb25zdGFudHNcbiAgfSxcblxuICAvLyBSZW5kZXJpbmcgc2V0dGluZ3NcbiAgUkVOREVSSU5HOiB7XG4gICAgLy8gRWxlbWVudCByZWN5Y2xpbmdcbiAgICBERUZBVUxUX01BWF9QT09MX1NJWkU6IDEwMCxcbiAgICBDTEFTU0VTOiB7XG4gICAgICBJVEVNOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgICB9LFxuICB9LFxuXG4gIC8vIExvYWRpbmcgc2V0dGluZ3NcbiAgTE9BRElORzoge1xuICAgIENBTkNFTF9USFJFU0hPTEQ6IDI1LCAvLyBweC9tcyAtIHZlbG9jaXR5IGFib3ZlIHdoaWNoIGxvYWRzIGNhbmNlbFxuICAgIE1BWF9DT05DVVJSRU5UX1JFUVVFU1RTOiAxLCAvLyBQYXJhbGxlbCByZXF1ZXN0cyBhbGxvd2VkXG4gICAgREVGQVVMVF9SQU5HRV9TSVpFOiAyMCwgLy8gSXRlbXMgcGVyIHJlcXVlc3RcbiAgICBERUJPVU5DRV9MT0FESU5HOiAxNTAsIC8vIERlYm91bmNlIGRlbGF5IChtcylcbiAgICBNSU5fUkFOR0VfU0laRTogMTAsIC8vIE1pbmltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBNQVhfUkFOR0VfU0laRTogMTAwLCAvLyBNYXhpbXVtIGl0ZW1zIHBlciBsb2FkXG4gICAgUkVRVUVTVF9USU1FT1VUOiA1MDAwLCAvLyBSZXF1ZXN0IHRpbWVvdXQgKG1zKVxuICAgIFJFVFJZX0FUVEVNUFRTOiAyLCAvLyBGYWlsZWQgcmVxdWVzdCByZXRyaWVzXG4gICAgUkVUUllfREVMQVk6IDEwMDAsIC8vIERlbGF5IGJldHdlZW4gcmV0cmllcyAobXMpXG4gIH0sXG5cbiAgLy8gUmVxdWVzdCBxdWV1ZSBjb25maWd1cmF0aW9uIChmcm9tIGZlYXR1cmVzL2NvbnN0YW50cylcbiAgUkVRVUVTVF9RVUVVRToge1xuICAgIEVOQUJMRUQ6IHRydWUsIC8vIEVuYWJsZSByZXF1ZXN0IHF1ZXVpbmdcbiAgICBNQVhfUVVFVUVfU0laRTogMSwgLy8gTWF4IHF1ZXVlZCByZXF1ZXN0c1xuICAgIE1BWF9BQ1RJVkVfUkVRVUVTVFM6IDIsIC8vIE1heCBjb25jdXJyZW50IGFjdGl2ZSByZXF1ZXN0c1xuICB9LFxuXG4gIC8vIFBsYWNlaG9sZGVyIHNldHRpbmdzXG4gIFBMQUNFSE9MREVSOiB7XG4gICAgTUFTS19DSEFSQUNURVI6IFwiWFwiLCAvLyBVcGRhdGVkIGZyb20gbGlzdC1tYW5hZ2VyXG4gICAgQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tcGxhY2Vob2xkZXJcIixcbiAgICBNQVhfU0FNUExFX1NJWkU6IDIwLFxuICAgIFBMQUNFSE9MREVSX0ZMQUc6IFwiX3BsYWNlaG9sZGVyXCIsXG4gICAgUkFORE9NX0xFTkdUSF9WQVJJQU5DRTogdHJ1ZSxcbiAgfSxcblxuICAvLyBTcGVlZCB0cmFja2luZyAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIFNQRUVEX1RSQUNLSU5HOiB7XG4gICAgLy8gVmVsb2NpdHkgY2FsY3VsYXRpb25cbiAgICBERUNFTEVSQVRJT05fRkFDVE9SOiAwLjg1LCAvLyB2ZWxvY2l0eSBkZWNheSBwZXIgZnJhbWVcbiAgfSxcblxuICAvLyBNb21lbnR1bSBzZXR0aW5nc1xuICBNT01FTlRVTToge1xuICAgIEVOQUJMRUQ6IGZhbHNlLCAvLyBFbmFibGUgbW9tZW50dW0gYnkgZGVmYXVsdFxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIEhvdyBxdWlja2x5IHZlbG9jaXR5IGRlY3JlYXNlcyBwZXIgZnJhbWVcbiAgICBNSU5fVkVMT0NJVFk6IDAuMSwgLy8gTWluaW11bSB2ZWxvY2l0eSBiZWZvcmUgc3RvcHBpbmcgKHB4L21zKVxuICAgIE1JTl9EVVJBVElPTjogMzAwLCAvLyBNYXhpbXVtIGdlc3R1cmUgZHVyYXRpb24gdG8gdHJpZ2dlciBtb21lbnR1bSAobXMpXG4gICAgTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRDogMC41LCAvLyBNaW5pbXVtIHZlbG9jaXR5IHRvIHRyaWdnZXIgbW9tZW50dW0gKHB4L21zKVxuICAgIEZSQU1FX1RJTUU6IDE2LCAvLyBBc3N1bWVkIGZyYW1lIHRpbWUgZm9yIGNhbGN1bGF0aW9ucyAobXMpXG4gIH0sXG5cbiAgLy8gSW5pdGlhbCBsb2FkIGNvbmZpZ3VyYXRpb24gKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBJTklUSUFMX0xPQUQ6IHtcbiAgICBTVFJBVEVHWTogXCJwbGFjZWhvbGRlcnNcIiwgLy8gXCJwbGFjZWhvbGRlcnNcIiB8IFwiZGlyZWN0XCIgfCBcInByb2dyZXNzaXZlXCJcbiAgICBWSUVXUE9SVF9NVUxUSVBMSUVSOiAxLjUsIC8vIGxvYWQgMS41eCB2aWV3cG9ydCBjYXBhY2l0eVxuICAgIE1JTl9JVEVNUzogMTAsXG4gICAgTUFYX0lURU1TOiAxMDAsXG4gICAgUExBQ0VIT0xERVJfQ09VTlQ6IDIwLCAvLyBkZWZhdWx0IHBsYWNlaG9sZGVyIGNvdW50XG4gICAgU0hPV19MT0FESU5HX1NUQVRFOiB0cnVlLFxuICAgIExPQURJTkdfREVMQVk6IDEwMCwgLy8gbXMgLSBkZWxheSBiZWZvcmUgc2hvd2luZyBsb2FkaW5nIHN0YXRlXG4gIH0sXG5cbiAgLy8gU2VsZWN0aW9uIHNldHRpbmdzXG4gIFNFTEVDVElPTjoge1xuICAgIFNFTEVDVEVEX0NMQVNTOiBcInZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIsXG4gIH0sXG5cbiAgLy8gU2Nyb2xsYmFyIHNldHRpbmdzIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU0NST0xMQkFSOiB7XG4gICAgLy8gQ1NTIGNsYXNzZXNcbiAgICBDTEFTU0VTOiB7XG4gICAgICBTQ1JPTExCQVI6IFwidmlld3BvcnRfX3Njcm9sbGJhclwiLFxuICAgICAgU0NST0xMQkFSX1RSQUNLOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdHJhY2tcIixcbiAgICAgIFNDUk9MTEJBUl9USFVNQjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRodW1iXCIsXG4gICAgICBTQ1JPTExCQVJfVklTSUJMRTogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS12aXNpYmxlXCIsXG4gICAgICBTQ1JPTExCQVJfRFJBR0dJTkc6IFwidmlld3BvcnRfX3Njcm9sbGJhci0tZHJhZ2dpbmdcIixcbiAgICAgIFNDUk9MTEJBUl9USFVNQl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRodW1iLS1kcmFnZ2luZ1wiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gT3JpZW50YXRpb24gKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBPUklFTlRBVElPTjoge1xuICAgIERFRkFVTFRfT1JJRU5UQVRJT046IFwidmVydGljYWxcIixcbiAgICBERUZBVUxUX0NST1NTX0FYSVNfQUxJR05NRU5UOiBcInN0cmV0Y2hcIixcbiAgICBSRVZFUlNFX0RJUkVDVElPTjogZmFsc2UsXG4gIH0sXG5cbiAgUEFHSU5BVElPTjoge1xuICAgIERFRkFVTFRfU1RSQVRFR1k6IFwib2Zmc2V0XCIgYXMgXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIixcbiAgICBERUZBVUxUX0xJTUlUOiAyMCxcbiAgICBTVFJBVEVHSUVTOiB7XG4gICAgICBQQUdFOiBcInBhZ2VcIiBhcyBjb25zdCxcbiAgICAgIE9GRlNFVDogXCJvZmZzZXRcIiBhcyBjb25zdCxcbiAgICAgIENVUlNPUjogXCJjdXJzb3JcIiBhcyBjb25zdCxcbiAgICB9LFxuICAgIENVUlNPUl9DTEVBTlVQX0lOVEVSVkFMOiA2MDAwMCwgLy8gQ2xlYW4gdXAgb2xkIGN1cnNvcnMgZXZlcnkgbWludXRlXG4gICAgTUFYX0NVUlNPUl9NQVBfU0laRTogMTAwMCwgLy8gTWF4aW11bSBudW1iZXIgb2YgY3Vyc29ycyB0byBrZWVwIGluIG1lbW9yeVxuICAgIC8vIEN1cnNvci1zcGVjaWZpYyB2aXJ0dWFsIHNpemluZ1xuICAgIENVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI6IDMsIC8vIE11bHRpcGx5IHJhbmdlU2l6ZSBieSB0aGlzIGZvciBzY3JvbGwgbWFyZ2luXG4gICAgQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjogMywgLy8gTWluaW11bSB2aXJ0dWFsIHNpemUgYXMgbXVsdGlwbGllciBvZiByYW5nZVNpemVcbiAgfSxcbn07XG5cbi8qKlxuICogVHlwZSBmb3Igb3ZlcnJpZGluZyBjb25zdGFudHMgYXQgcnVudGltZVxuICovXG5leHBvcnQgdHlwZSBWaWV3cG9ydENvbnN0YW50cyA9IHR5cGVvZiBWSUVXUE9SVF9DT05TVEFOVFM7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIG1lcmdlIHVzZXIgY29uc3RhbnRzIHdpdGggZGVmYXVsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29uc3RhbnRzKFxuICB1c2VyQ29uc3RhbnRzOiBQYXJ0aWFsPFZpZXdwb3J0Q29uc3RhbnRzPiA9IHt9LFxuKTogVmlld3BvcnRDb25zdGFudHMge1xuICByZXR1cm4ge1xuICAgIC4uLlZJRVdQT1JUX0NPTlNUQU5UUyxcbiAgICAuLi51c2VyQ29uc3RhbnRzLFxuICB9O1xufVxuIiwKICAgICIvKipcbiAqIFZpcnR1YWwgRmVhdHVyZSAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgY2FsY3VsYXRpb25zXG4gKiBIYW5kbGVzIHZpc2libGUgcmFuZ2UgY2FsY3VsYXRpb24gYW5kIHRvdGFsIHZpcnR1YWwgc2l6ZSBtYW5hZ2VtZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbENvbmZpZyB7XG4gIGl0ZW1TaXplPzogbnVtYmVyO1xuICBvdmVyc2Nhbj86IG51bWJlcjtcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbiAgYXV0b0RldGVjdEl0ZW1TaXplPzogYm9vbGVhbjtcbiAgZGVidWc/OiBib29sZWFuO1xuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVmlydHVhbCBzY3JvbGxpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbnMgd2l0aCBjb21wcmVzc2lvbiBmb3IgbGFyZ2UgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhWaXJ0dWFsID0gKGNvbmZpZzogVmlydHVhbENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBpdGVtU2l6ZSxcbiAgICAgIG92ZXJzY2FuID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLk9WRVJTQ0FOX0JVRkZFUixcbiAgICAgIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiLFxuICAgICAgYXV0b0RldGVjdEl0ZW1TaXplID0gaXRlbVNpemUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5BVVRPX0RFVEVDVF9JVEVNX1NJWkVcbiAgICAgICAgOiBmYWxzZSxcbiAgICAgIGRlYnVnID0gZmFsc2UsXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgcHJvdmlkZWQgaXRlbVNpemUgb3IgZGVmYXVsdCwgYnV0IG1hcmsgaWYgd2Ugc2hvdWxkIGF1dG8tZGV0ZWN0XG4gICAgY29uc3QgaW5pdGlhbEl0ZW1TaXplID1cbiAgICAgIGl0ZW1TaXplIHx8IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5ERUZBVUxUX0lURU1fU0laRTtcblxuICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBoYXNDYWxjdWxhdGVkSXRlbVNpemUgPSBmYWxzZTtcbiAgICBsZXQgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVjYWxjdWxhdGVkIHNjcm9sbCBwb3NpdGlvbiBmb3IgY29tcHJlc3Npb25cblxuICAgIC8vIEluaXRpYWxpemUgdXNpbmcgc2hhcmVkIHdyYXBwZXJcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgT2JqZWN0LmFzc2lnbih2aWV3cG9ydFN0YXRlLCB7XG4gICAgICAgIGl0ZW1TaXplOiBpbml0aWFsSXRlbVNpemUsXG4gICAgICAgIG92ZXJzY2FuLFxuICAgICAgICBjb250YWluZXJTaXplOlxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50Py5bXG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgICAgXSB8fCA2MDAsXG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWwgc2Nyb2xsIGluZGV4LCBjYWxjdWxhdGUgaW5pdGlhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgIC8vIE5vdGU6IFdlIHN0b3JlIHRoZSBpbml0aWFsU2Nyb2xsSW5kZXggdG8gdXNlIGRpcmVjdGx5IGluIHJhbmdlIGNhbGN1bGF0aW9uc1xuICAgICAgLy8gYmVjYXVzZSBzY3JvbGwgcG9zaXRpb24gbWF5IGJlIGNvbXByZXNzZWQgZm9yIGxhcmdlIGxpc3RzXG4gICAgICBsZXQgaW5pdGlhbFNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwO1xuXG4gICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAvLyBTdG9yZSB0aGUgdGFyZ2V0IGluZGV4IGZvciB1c2UgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAgICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXggPSBpbml0aWFsU2Nyb2xsSW5kZXg7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiAobWF5IGJlIGNvbXByZXNzZWQgZm9yIGxhcmdlIGxpc3RzKVxuICAgICAgICBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCAqICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSk7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBpbml0aWFsU2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgc2Nyb2xsaW5nIGZlYXR1cmUgaGFzIGluaXRpYWxpemVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogaW5pdGlhbFNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgc291cmNlOiBcImluaXRpYWwtc2Nyb2xsLWluZGV4XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2UoaW5pdGlhbFNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgLy8gRW5zdXJlIGNvbnRhaW5lciBzaXplIGlzIG1lYXN1cmVkIGFmdGVyIERPTSBpcyByZWFkeVxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gICAgY29uc3QgZ2V0Q29tcHJlc3Npb25SYXRpbyA9ICgpOiBudW1iZXIgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplKSByZXR1cm4gMTtcbiAgICAgIGNvbnN0IGFjdHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgcmV0dXJuIGFjdHVhbFNpemUgPD0gTUFYX1ZJUlRVQUxfU0laRSA/IDEgOiBNQVhfVklSVFVBTF9TSVpFIC8gYWN0dWFsU2l6ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgbG9nID0gKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgaWYgKGRlYnVnKSBjb25zb2xlLmxvZyhgW1ZpcnR1YWxdICR7bWVzc2FnZX1gLCBkYXRhKTtcbiAgICB9O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHZpc2libGUgcmFuZ2VcbiAgICBjb25zdCBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UgPSAoXG4gICAgICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLFxuICAgICk6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1ZpcnR1YWxdIE5vIHZpZXdwb3J0IHN0YXRlLCByZXR1cm5pbmcgZW1wdHkgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuXG4gICAgICAvLyBFYXJseSByZXR1cm5zIGZvciBpbnZhbGlkIHN0YXRlc1xuICAgICAgaWYgKFxuICAgICAgICAhY29udGFpbmVyU2l6ZSB8fFxuICAgICAgICBjb250YWluZXJTaXplIDw9IDAgfHxcbiAgICAgICAgIXRvdGFsSXRlbXMgfHxcbiAgICAgICAgdG90YWxJdGVtcyA8PSAwXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIHJhbmdlXG4gICAgICAgIC8vIGV2ZW4gd2hlbiB0b3RhbEl0ZW1zIGlzIDAgKG5vdCB5ZXQgbG9hZGVkIGZyb20gQVBJKVxuICAgICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChcbiAgICAgICAgICAgIChjb250YWluZXJTaXplIHx8IDYwMCkgL1xuICAgICAgICAgICAgICAodmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBpbml0aWFsU2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG4gICAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICB9XG4gICAgICAgIGxvZyhgSW52YWxpZCBzdGF0ZTogY29udGFpbmVyPSR7Y29udGFpbmVyU2l6ZX0sIGl0ZW1zPSR7dG90YWxJdGVtc31gKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aXJ0dWFsU2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSk7XG4gICAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuXG4gICAgICBsZXQgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSB0YXJnZXQgc2Nyb2xsIGluZGV4IChmb3IgaW5pdGlhbFNjcm9sbEluZGV4IHdpdGggY29tcHJlc3Npb24pXG4gICAgICBjb25zdCB0YXJnZXRTY3JvbGxJbmRleCA9ICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG5cbiAgICAgIGlmIChjb21wcmVzc2lvblJhdGlvIDwgMSkge1xuICAgICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIGNhbGN1bGF0aW9uXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSB0YXJnZXRTY3JvbGxJbmRleCwgdXNlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsY3VsYXRpbmcgZnJvbSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIHNob3cgdGhlIGNvcnJlY3QgaXRlbXMgZXZlbiB3aGVuIHZpcnR1YWwgc3BhY2UgaXMgY29tcHJlc3NlZFxuICAgICAgICBpZiAodGFyZ2V0U2Nyb2xsSW5kZXggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIHRhcmdldFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgIGVuZCA9IE1hdGgubWluKFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDEsXG4gICAgICAgICAgICB0YXJnZXRTY3JvbGxJbmRleCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggYWZ0ZXIgZmlyc3QgdXNlIHNvIG5vcm1hbCBzY3JvbGxpbmcgd29ya3NcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFNpemU7XG4gICAgICAgICAgY29uc3QgZXhhY3RJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgICBzdGFydCA9IE1hdGguZmxvb3IoZXhhY3RJbmRleCk7XG4gICAgICAgICAgZW5kID0gTWF0aC5jZWlsKGV4YWN0SW5kZXgpICsgdmlzaWJsZUNvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmVhci1ib3R0b20gaGFuZGxpbmdcbiAgICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdmlydHVhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGwgLSBzY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tIDw9IGNvbnRhaW5lclNpemUgJiYgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xKSB7XG4gICAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb250YWluZXJTaXplIC8gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gY29udGFpbmVyU2l6ZSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIHN0YXJ0ICsgKGZpcnN0VmlzaWJsZUF0Qm90dG9tIC0gc3RhcnQpICogaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGVuZCA9XG4gICAgICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gMVxuICAgICAgICAgICAgICA/IHRvdGFsSXRlbXMgLSAxXG4gICAgICAgICAgICAgIDogTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4pO1xuXG4gICAgICAgICAgbG9nKFwiTmVhciBib3R0b20gY2FsY3VsYXRpb246XCIsIHtcbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSxcbiAgICAgICAgICAgIGludGVycG9sYXRpb24sXG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG92ZXJzY2FuXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBlbmQgKyBvdmVyc2Nhbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXJlY3QgY2FsY3VsYXRpb25cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGguZmxvb3Ioc2Nyb2xsUG9zaXRpb24gLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKSAtIG92ZXJzY2FuLFxuICAgICAgICApO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbiAqIDIpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBvdXRwdXRcbiAgICAgIGlmIChpc05hTihzdGFydCkgfHwgaXNOYU4oZW5kKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1ZpcnR1YWxdIE5hTiBpbiByYW5nZSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICBpdGVtU2l6ZTogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSxcbiAgICAgICAgICBjb21wcmVzc2lvblJhdGlvLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICAvLyBsb2coYFJhbmdlOiAke3N0YXJ0fS0ke2VuZH0gKHNjcm9sbDogJHtzY3JvbGxQb3NpdGlvbn0pYCk7XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGxhc3QgcmFuZ2VcbiAgICAgIC8vIGlmIChlbmQgPj0gdG90YWxJdGVtcyAtIDEwKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbVmlydHVhbF0gTmVhciBlbmQgcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9LCBsYXN0SXRlbVBvcz0ke1xuICAgICAgLy8gICAgICAgZW5kICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZVxuICAgICAgLy8gICAgIH1weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFjdHVhbCB2aXNpYmxlIHJhbmdlICh3aXRob3V0IG92ZXJzY2FuIGJ1ZmZlcilcbiAgICBjb25zdCBjYWxjdWxhdGVBY3R1YWxWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyU2l6ZSwgdG90YWxJdGVtcyB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgIGlmICghY29udGFpbmVyU2l6ZSB8fCAhdG90YWxJdGVtcykgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuXG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemVcbiAgICAgICAgPyAodG90YWxJdGVtcyAqIGl0ZW1TaXplKSAvIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA6IDE7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgLSBjYWxjdWxhdGUgYmFzZWQgb24gc2Nyb2xsIHJhdGlvXG4gICAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFNpemU7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgLSAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zaXRpb24gLyBpdGVtU2l6ZSk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgdmFsaWQgcmFuZ2VcbiAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQpO1xuICAgICAgZW5kID0gTWF0aC5tYXgoc3RhcnQsIGVuZCk7XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgLy8gREVCVUc6IExvZyB3aG8gY2FsbHMgdXBkYXRlVmlzaWJsZVJhbmdlIHdpdGggMCB3aGVuIGl0IHNob3VsZCBiZSBub24temVyb1xuXG4gICAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4pIGZvciBVSSBkaXNwbGF5XG4gICAgICBjb25zdCBhY3R1YWxWaXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVBY3R1YWxWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCB7XG4gICAgICAgIHJhbmdlOiB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBhY3R1YWxWaXNpYmxlUmFuZ2UsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0b3RhbCB2aXJ0dWFsIHNpemVcbiAgICBjb25zdCB1cGRhdGVUb3RhbFZpcnR1YWxTaXplID0gKHRvdGFsSXRlbXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9sZFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemU7XG4gICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbEl0ZW1zO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAvLyBHZXQgcGFkZGluZyBmcm9tIHRoZSBpdGVtcyBjb250YWluZXIgaWYgYXZhaWxhYmxlXG4gICAgICBsZXQgdG90YWxQYWRkaW5nID0gMDtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwYWRkaW5nVG9wID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3ApIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMDtcbiAgICAgICAgdG90YWxQYWRkaW5nID0gcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b207XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2x1ZGUgcGFkZGluZyBpbiB0aGUgdmlydHVhbCBzaXplXG4gICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgYWN0dWFsU2l6ZSArIHRvdGFsUGFkZGluZyxcbiAgICAgICAgTUFYX1ZJUlRVQUxfU0laRSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGRlYnVnZ2luZyBnYXAgaXNzdWVcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1ZpcnR1YWxdIFRvdGFsIHNpemUgdXBkYXRlOiBpdGVtcz0ke3RvdGFsSXRlbXN9LCBpdGVtU2l6ZT0ke3ZpZXdwb3J0U3RhdGUuaXRlbVNpemV9cHgsIHBhZGRpbmc9JHt0b3RhbFBhZGRpbmd9cHgsIHZpcnR1YWxTaXplPSR7dmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplfXB4ICh3YXMgJHtvbGRTaXplfXB4KWBcbiAgICAgIC8vICk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdG90YWxJdGVtczogdG90YWxJdGVtcyxcbiAgICAgICAgY29tcHJlc3Npb25SYXRpbzogZ2V0Q29tcHJlc3Npb25SYXRpbygpLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBjb250YWluZXIgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclNpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgIXZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudFtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgPyBcIm9mZnNldFdpZHRoXCJcbiAgICAgICAgICAgIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICBdO1xuXG4gICAgICAvLyBMb2cgdGhlIGFjdHVhbCBtZWFzdXJlbWVudFxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gQ29udGFpbmVyIHNpemUgbWVhc3VyZWQ6ICR7c2l6ZX1weCBmcm9tIHZpZXdwb3J0IGVsZW1lbnRgXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoc2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7IC8vIEFsc28gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZTogc2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIHZpZXdwb3J0IG1ldGhvZHNcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0VmlzaWJsZVJhbmdlID0gKCkgPT5cbiAgICAgIHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZSB8fFxuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShkYXRhLnBvc2l0aW9uKSxcbiAgICApO1xuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhLnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWxJdGVtcyk7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgcGFnaW5hdGlvbilcbiAgICAvLyBOb3RlOiBzZXRUb3RhbEl0ZW1zKCkgdXBkYXRlcyB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgQkVGT1JFIGVtaXR0aW5nIHRoaXMgZXZlbnQsXG4gICAgLy8gc28gd2UgY2FuJ3QgcmVseSBvbiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgdG8gZGV0ZWN0IHRoZSBmaXJzdCB0b3RhbC5cbiAgICAvLyBJbnN0ZWFkIHdlIHVzZSB0aGUgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gZmxhZy5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAvLyBGSVg6IFdoZW4gd2UgZmlyc3QgcmVjZWl2ZSB0b3RhbEl0ZW1zIHdpdGggaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBjb21wcmVzc2lvbixcbiAgICAgIC8vIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB0byBhY2NvdW50IGZvciBjb21wcmVzc2lvbi5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgaW5pdGlhbFNjcm9sbEluZGV4IGNhbGN1bGF0ZXMgcG9zaXRpb24gYXMgaW5kZXggKiBpdGVtU2l6ZSxcbiAgICAgIC8vIGJ1dCByZW5kZXJpbmcgdXNlcyBjb21wcmVzc2VkIHNwYWNlLCBjYXVzaW5nIGl0ZW1zIHRvIGFwcGVhciBvZmYtc2NyZWVuLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNoZWNrIHRoaXMgQkVGT1JFIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgYmVjYXVzZSB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgICAvLyBzY3JvbGwgcG9zaXRpb24gYmFzZWQgb24gdGhlIG5ldyB0b3RhbCwgYW5kIHRoZSBmbGFnIGVuc3VyZXMgd2Ugb25seSBkbyB0aGlzIG9uY2UuXG4gICAgICBpZiAoXG4gICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiZcbiAgICAgICAgIWhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uICYmXG4gICAgICAgIGRhdGEudG90YWwgPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gZGF0YS50b3RhbCAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB1c2luZyBjb21wcmVzc2lvbi1hd2FyZSBmb3JtdWxhXG4gICAgICAgICAgLy8gU2FtZSBmb3JtdWxhIHVzZWQgaW4gc2Nyb2xsVG9JbmRleFxuICAgICAgICAgIGNvbnN0IHJhdGlvID0gaW5pdGlhbFNjcm9sbEluZGV4IC8gZGF0YS50b3RhbDtcbiAgICAgICAgICBjb25zdCBjb21wcmVzc2VkUG9zaXRpb24gPSByYXRpbyAqIE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gY29tcHJlc3NlZFBvc2l0aW9uO1xuXG4gICAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogY29tcHJlc3NlZFBvc2l0aW9uLFxuICAgICAgICAgICAgc291cmNlOiBcImNvbXByZXNzaW9uLXJlY2FsY3VsYXRpb25cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENsZWFyIHRhcmdldFNjcm9sbEluZGV4IHNpbmNlIHdlJ3ZlIG5vdyBjb3JyZWN0bHkgY2FsY3VsYXRlZCB0aGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgLy8gVGhlIG5vcm1hbCBjb21wcmVzc2VkIHNjcm9sbGluZyBmb3JtdWxhIHdpbGwgbm93IHdvcmsgY29ycmVjdGx5XG4gICAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGFzIGRvbmUgZXZlbiBpZiBub3QgY29tcHJlc3NlZCAtIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGNoZWNrIG9uY2VcbiAgICAgICAgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHRvIHVwZGF0ZSB0aGUgdmlld1xuICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXMgdG8gcmVjYWxjdWxhdGUgdmlydHVhbCBzaXplXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIGRhdGEuY29udGFpbmVyU2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzaXplIHdpdGggbmV3IGNvbnRhaW5lciBzaXplXG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGRhdGEudG90YWwgIT09IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXNcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgfVxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpcnN0IGl0ZW1zIHJlbmRlcmVkIHRvIGNhbGN1bGF0ZSBpdGVtIHNpemUgKGlmIGF1dG8tZGV0ZWN0aW9uIGlzIGVuYWJsZWQpXG4gICAgaWYgKGF1dG9EZXRlY3RJdGVtU2l6ZSkge1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaGFzQ2FsY3VsYXRlZEl0ZW1TaXplICYmXG4gICAgICAgICAgZGF0YS5lbGVtZW50cz8ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHZpZXdwb3J0U3RhdGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgaXRlbSBzaXplIGZyb20gZmlyc3QgcmVuZGVyZWQgYmF0Y2hcbiAgICAgICAgICBjb25zdCBzaXplczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICBjb25zdCBzaXplUHJvcGVydHkgPVxuICAgICAgICAgICAgb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gXCJvZmZzZXRXaWR0aFwiIDogXCJvZmZzZXRIZWlnaHRcIjtcblxuICAgICAgICAgIGRhdGEuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBlbGVtZW50W3NpemVQcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgc2l6ZXMucHVzaChzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzaXplcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhdmdTaXplID0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgc2l6ZXMucmVkdWNlKChzdW0sIHNpemUpID0+IHN1bSArIHNpemUsIDApIC8gc2l6ZXMubGVuZ3RoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSA9IGF2Z1NpemU7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4LCByZWNhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBuZXdseSBkZXRlY3RlZCBpdGVtIHNpemVcbiAgICAgICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwICYmIGF2Z1NpemUgIT09IHByZXZpb3VzSXRlbVNpemUpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2Nyb2xsUG9zaXRpb24gPSBpbml0aWFsU2Nyb2xsSW5kZXggKiBhdmdTaXplO1xuICAgICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gbmV3U2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXdTY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFwiaXRlbS1zaXplLWRldGVjdGVkXCIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSBldmVyeXRoaW5nIHdpdGggbmV3IHNpemVcbiAgICAgICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcbiAgICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgICAgICAgICAvLyBSZS1yZW5kZXIgdG8gYWRqdXN0IHBvc2l0aW9uc1xuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHNpemUgY2hhbmdlXG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6aXRlbS1zaXplLWRldGVjdGVkXCIsIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNTaXplOiBpbml0aWFsSXRlbVNpemUsXG4gICAgICAgICAgICAgIGRldGVjdGVkU2l6ZTogYXZnU2l6ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBoYXNDYWxjdWxhdGVkSXRlbVNpemUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIHZpcnR1YWwgQVBJXG4gICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IGdldENvbXByZXNzaW9uUmF0aW8oKTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkudmlydHVhbCA9IHtcbiAgICAgIGNhbGN1bGF0ZVZpc2libGVSYW5nZSxcbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUsXG4gICAgICBnZXRUb3RhbFZpcnR1YWxTaXplOiAoKSA9PiB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IDAsXG4gICAgICBnZXRDb250YWluZXJTaXplOiAoKSA9PiB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IDAsXG4gICAgICB1cGRhdGVDb250YWluZXJTaXplOiAoc2l6ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldEl0ZW1TaXplOiAoKSA9PiB2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUsXG4gICAgICBjYWxjdWxhdGVJbmRleEZyb21Qb3NpdGlvbjogKHBvc2l0aW9uOiBudW1iZXIpID0+XG4gICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgcG9zaXRpb24gL1xuICAgICAgICAgICAgKCh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyksXG4gICAgICAgICksXG4gICAgICBjYWxjdWxhdGVQb3NpdGlvbkZvckluZGV4OiAoaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgaW5kZXggKiAodmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSAqIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvKipcbiAqIFNjcm9sbGluZyBGZWF0dXJlIC0gVmlydHVhbCBzY3JvbGxpbmcgd2l0aCBpbnRlZ3JhdGVkIHZlbG9jaXR5IHRyYWNraW5nXG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdG91Y2gvbW91c2UgZXZlbnRzLCBzY3JvbGwgcG9zaXRpb24gbWFuYWdlbWVudCwgdmVsb2NpdHkgbWVhc3VyZW1lbnQsIGFuZCBtb21lbnR1bSBzY3JvbGxpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlLCBjbGFtcCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsaW5nQ29uZmlnIHtcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbiAgc2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIHNtb290aGluZz86IGJvb2xlYW47XG4gIGlkbGVUaW1lb3V0PzogbnVtYmVyO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgY29uc3QgaW5zdGFudFZlbG9jaXR5ID0gTWF0aC5hYnMocG9zaXRpb25EZWx0YSkgLyB0aW1lRGVsdGE7XG5cbiAgLy8gQWRkIG5ldyBzYW1wbGVcbiAgY29uc3Qgc2FtcGxlcyA9IFsuLi50cmFja2VyLnNhbXBsZXMsIHsgcG9zaXRpb246IG5ld1Bvc2l0aW9uLCB0aW1lOiBub3cgfV07XG5cbiAgLy8gS2VlcCBvbmx5IHJlY2VudCBzYW1wbGVzIChsYXN0IDEwMG1zKVxuICBjb25zdCByZWNlbnRTYW1wbGVzID0gc2FtcGxlcy5maWx0ZXIoKHMpID0+IG5vdyAtIHMudGltZSA8IDEwMCk7XG5cbiAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgdmVsb2NpdHkgZnJvbSByZWNlbnQgc2FtcGxlc1xuICBsZXQgYXZnVmVsb2NpdHkgPSBpbnN0YW50VmVsb2NpdHk7XG4gIGlmIChyZWNlbnRTYW1wbGVzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBvbGRlc3RTYW1wbGUgPSByZWNlbnRTYW1wbGVzWzBdO1xuICAgIGNvbnN0IHRvdGFsRGlzdGFuY2UgPSBNYXRoLmFicyhuZXdQb3NpdGlvbiAtIG9sZGVzdFNhbXBsZS5wb3NpdGlvbik7XG4gICAgY29uc3QgdG90YWxUaW1lID0gbm93IC0gb2xkZXN0U2FtcGxlLnRpbWU7XG4gICAgYXZnVmVsb2NpdHkgPSB0b3RhbFRpbWUgPiAwID8gdG90YWxEaXN0YW5jZSAvIHRvdGFsVGltZSA6IGluc3RhbnRWZWxvY2l0eTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVsb2NpdHk6IGF2Z1ZlbG9jaXR5LFxuICAgIGxhc3RQb3NpdGlvbjogbmV3UG9zaXRpb24sXG4gICAgbGFzdFRpbWU6IG5vdyxcbiAgICBkaXJlY3Rpb246IHBvc2l0aW9uRGVsdGEgPj0gMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgIHNhbXBsZXM6IHJlY2VudFNhbXBsZXMsXG4gIH07XG59O1xuXG4vKipcbiAqIFNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB3aGVlbCBldmVudHMsIHZlbG9jaXR5IHRyYWNraW5nLCBhbmQgaWRsZSBkZXRlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTY3JvbGxpbmcgPSAoY29uZmlnOiBTY3JvbGxpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBzZW5zaXRpdml0eSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5TQ1JPTExfU0VOU0lUSVZJVFksXG4gICAgICBzbW9vdGhpbmcgPSBmYWxzZSxcbiAgICAgIGlkbGVUaW1lb3V0ID0gMTAwLCAvLyBEZWZhdWx0IGlkbGUgdGltZW91dCBpbiBtc1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBzY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBHZXQgdmlld3BvcnQgc3RhdGVcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuXG4gICAgLy8gVXNlIHNoYXJlZCBpbml0aWFsaXphdGlvbiB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIHZhbHVlc1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICBjb250YWluZXJTaXplID0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplIHx8IDA7XG4gICAgICAgIC8vIFN5bmMgc2Nyb2xsUG9zaXRpb24gZnJvbSB2aWV3cG9ydFN0YXRlIChpbXBvcnRhbnQgZm9yIGluaXRpYWxTY3JvbGxJbmRleClcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFZpcnR1YWwgc2l6ZSBjaGFuZ2VkOlwiLCBkYXRhKTtcbiAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgcG9zaXRpb24gY2hhbmdlcyBmcm9tIG90aGVyIGZlYXR1cmVzIChlLmcuLCB2aXJ0dWFsLnRzIGFmdGVyIGl0ZW0gc2l6ZSBkZXRlY3Rpb24pXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBkYXRhLnBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBsb2NhbCB0cmFja2luZyB2YXJzXG4gICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgY29udGFpbmVyU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQXR0YWNoIHdoZWVsIGV2ZW50IGxpc3RlbmVyIHRvIHZpZXdwb3J0IGVsZW1lbnRcbiAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gQXR0YWNoaW5nIHdoZWVsIGV2ZW50IHRvIHZpZXdwb3J0IGVsZW1lbnRgKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtTY3JvbGxpbmddIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmQgZm9yIHdoZWVsIGV2ZW50c2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXNlIGNsYW1wIGZyb20gdXRpbHNcblxuICAgIC8vIFN0YXJ0IGlkbGUgZGV0ZWN0aW9uXG4gICAgY29uc3Qgc3RhcnRJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBTdGFydGluZyBpZGxlIGRldGVjdGlvblwiKTtcblxuICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gZmlyc3RcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gUmVzZXQgaWRsZSBlbWlzc2lvbiBmbGFnXG4gICAgICBjb25zdCBjaGVja0lkbGUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA9PT0gbGFzdElkbGVDaGVja1Bvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gaGFzbid0IGNoYW5nZWQgLSB3ZSdyZSBpZGxlXG4gICAgICAgICAgaWYgKCFoYXNFbWl0dGVkSWRsZSAmJiAoc3BlZWRUcmFja2VyLnZlbG9jaXR5ID4gMCB8fCBpc1Njcm9sbGluZykpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBcIltTY3JvbGxpbmddIElkbGUgZGV0ZWN0ZWQgLSBwb3NpdGlvbiBzdGFibGUsIHNldHRpbmcgdmVsb2NpdHkgdG8gemVyb1wiXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgaGFzRW1pdHRlZElkbGUgPSB0cnVlOyAvLyBNYXJrIHRoYXQgd2UndmUgZW1pdHRlZCBpZGxlXG4gICAgICAgICAgICBzZXRWZWxvY2l0eVRvWmVybygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQb3NpdGlvbiBjaGFuZ2VkLCByZXNldCB0aGUgZmxhZ1xuICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgICB9O1xuICAgICAgaWRsZUNoZWNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2hlY2tJZGxlKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0b3BJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKGlkbGVDaGVja0ZyYW1lKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RvcHBpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkbGVDaGVja0ZyYW1lKTtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgdmVsb2NpdHkgdG8gemVybyBhbmQgZW1pdCBpZGxlIGV2ZW50XG4gICAgY29uc3Qgc2V0VmVsb2NpdHlUb1plcm8gPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFNldHRpbmcgdmVsb2NpdHkgdG8gemVybyBhbmQgZW1pdHRpbmcgaWRsZVwiKTtcblxuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHdoZWVsIGV2ZW50XG4gICAgY29uc3QgaGFuZGxlV2hlZWwgPSAoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGV2ZW50LmRlbHRhWSA6IGV2ZW50LmRlbHRhWDtcbiAgICAgIGNvbnN0IHNjcm9sbERlbHRhID0gZGVsdGEgKiBzZW5zaXRpdml0eTtcblxuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBsZXQgbmV3UG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbiArIHNjcm9sbERlbHRhO1xuXG4gICAgICAvLyBBcHBseSBzbW9vdGhpbmcgaWYgZW5hYmxlZFxuICAgICAgaWYgKHNtb290aGluZykge1xuICAgICAgICBjb25zdCBzbW9vdGhpbmdGYWN0b3IgPSAwLjM7XG4gICAgICAgIG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YSAqIHNtb290aGluZ0ZhY3RvcjtcbiAgICAgIH1cblxuICAgICAgbmV3UG9zaXRpb24gPSBjbGFtcChuZXdQb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgaWYgKG5ld1Bvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGVcbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAvLyBTdG9wIGFueSBleGlzdGluZyBpZGxlIGRldGVjdGlvbiBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZVxuICAgICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBub3c7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXJcbiAgICAgICAgc3BlZWRUcmFja2VyID0gdXBkYXRlU3BlZWRUcmFja2VyKFxuICAgICAgICAgIHNwZWVkVHJhY2tlcixcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZlbG9jaXR5ID0gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsRGlyZWN0aW9uID0gc3BlZWRUcmFja2VyLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZlbG9jaXR5LWNoYW5nZWRcIiwge1xuICAgICAgICAgIHZlbG9jaXR5OiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbmRlclxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2Nyb2xsIHRvIHBvc2l0aW9uXG4gICAgY29uc3Qgc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IGNsYW1wZWRQb3NpdGlvbiA9IGNsYW1wKHBvc2l0aW9uLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvUG9zaXRpb246IHBvcz0ke3Bvc2l0aW9ufSAtPiAke2NsYW1wZWRQb3NpdGlvbn0sIHNvdXJjZT0ke3NvdXJjZX0sIGN1cnJlbnRQb3M9JHtzY3JvbGxQb3NpdGlvbn0sIHZlbG9jaXR5PSR7c3BlZWRUcmFja2VyLnZlbG9jaXR5LnRvRml4ZWQoXG4gICAgICAvLyAgICAgM1xuICAgICAgLy8gICApfWBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChjbGFtcGVkUG9zaXRpb24gIT09IHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBjbGFtcGVkUG9zaXRpb247XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXIgdG8gY2FsY3VsYXRlIHZlbG9jaXR5XG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgIGNsYW1wZWRQb3NpdGlvbiA+IHByZXZpb3VzUG9zaXRpb24gPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIjtcblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aW1lb3V0c1xuICAgICAgICBpZiAoaWRsZVRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZW91dElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzY3JvbGxCeSBtZXRob2RcbiAgICBjb25zdCBzY3JvbGxCeSA9IChkZWx0YTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGNsYW1wKHNjcm9sbFBvc2l0aW9uICsgZGVsdGEsIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gcHJldmlvdXNQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc2Nyb2xsIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvbiBpZiBub3Qgc2Nyb2xsaW5nXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHBvc2Ugc2Nyb2xsaW5nIHN0YXRlIGZvciBvdGhlciBmZWF0dXJlc1xuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZSA9IHtcbiAgICAgIHNldFZlbG9jaXR5VG9aZXJvLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgdG8gdmlld3BvcnQgQVBJXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5ID0gc2Nyb2xsQnk7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5ID0gKCkgPT4gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBBUElcbiAgICAoY29tcG9uZW50IGFzIGFueSkuc2Nyb2xsaW5nID0ge1xuICAgICAgaGFuZGxlV2hlZWwsXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uLFxuICAgICAgc2Nyb2xsVG9JbmRleCxcbiAgICAgIHNjcm9sbFRvUGFnZSxcbiAgICAgIHNjcm9sbEJ5LFxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzLFxuICAgICAgZ2V0VmVsb2NpdHk6ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgIGdldERpcmVjdGlvbjogKCkgPT4gc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIGlzU2Nyb2xsaW5nOiAoKSA9PiBpc1Njcm9sbGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50c1xuXG4vKipcbiAqIFNjcm9sbGJhciBGZWF0dXJlIC0gQ3VzdG9tIHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvblxuICogUHJvdmlkZXMgdmlzdWFsIHNjcm9sbCBpbmRpY2F0aW9uIGFuZCBkcmFnLXRvLXNjcm9sbCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgd3JhcERlc3Ryb3ksIHN0b3JlRmVhdHVyZUZ1bmN0aW9uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYXV0b0hpZGU/OiBib29sZWFuO1xuICB0aHVtYk1pbkhlaWdodD86IG51bWJlcjtcbiAgdGh1bWJDb2xvcj86IHN0cmluZztcbiAgdHJhY2tDb2xvcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICBmYWRlVGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb21wb25lbnQge1xuICBzY3JvbGxiYXI6IHtcbiAgICBzaG93OiAoKSA9PiB2b2lkO1xuICAgIGhpZGU6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlQm91bmRzOiAodG90YWxWaXJ0dWFsU2l6ZTogbnVtYmVyLCBjb250YWluZXJTaXplOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgdXBkYXRlUG9zaXRpb246IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgc2Nyb2xsYmFyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2Nyb2xsYmFyKGNvbmZpZzogU2Nyb2xsYmFyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVFxuICApOiBUICYgU2Nyb2xsYmFyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGF1dG9IaWRlID0gdHJ1ZSxcbiAgICAgIHRodW1iTWluSGVpZ2h0ID0gMjUsXG4gICAgICBib3JkZXJSYWRpdXMgPSA0LFxuICAgICAgZmFkZVRpbWVvdXQgPSAxMDAwLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBSZXR1cm4gbm8tb3AgaWYgZGlzYWJsZWRcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgc2Nyb2xsYmFyOiB7XG4gICAgICAgICAgc2hvdzogKCkgPT4ge30sXG4gICAgICAgICAgaGlkZTogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlQm91bmRzOiAoKSA9PiB7fSxcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbjogKCkgPT4ge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IHZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc2Nyb2xsYmFyVHJhY2s6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRodW1iOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgZHJhZ1N0YXJ0WSA9IDA7XG4gICAgbGV0IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICBsZXQgaGlkZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgdGh1bWJIZWlnaHQgPSAwO1xuICAgIGxldCBhbmltYXRpb25GcmFtZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNDdXJzb3JNb2RlID0gZmFsc2U7XG4gICAgbGV0IGxvYWRlZEl0ZW1zQ291bnQgPSAwO1xuXG4gICAgLy8gQ3JlYXRlIHNjcm9sbGJhciBlbGVtZW50c1xuICAgIGNvbnN0IGNyZWF0ZVNjcm9sbGJhckVsZW1lbnRzID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYWRkQ2xhc3Moc2Nyb2xsYmFyVHJhY2ssIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVIpO1xuICAgICAgc2Nyb2xsYmFyVHJhY2suc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgYDtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVEhVTUJcbiAgICAgICk7XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrLmFwcGVuZENoaWxkKHNjcm9sbGJhclRodW1iKTtcbiAgICAgIHZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxiYXJUcmFjayk7XG4gICAgfTtcblxuICAgIC8vIFNob3cvaGlkZSBmdW5jdGlvbnNcbiAgICBjb25zdCBzaG93ID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCB0b3RhbFZpcnR1YWxTaXplIDw9IGNvbnRhaW5lclNpemUpIHJldHVybjtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG5cbiAgICAgIGlmIChhdXRvSGlkZSAmJiAhaXNEcmFnZ2luZykge1xuICAgICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoaGlkZSwgZmFkZVRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCBpc0RyYWdnaW5nKSByZXR1cm47XG4gICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbGJhciBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVCb3VuZHMgPSAobmV3VG90YWxTaXplOiBudW1iZXIsIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcikgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8ICFzY3JvbGxiYXJUaHVtYikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZWVkc1Njcm9sbGJhciA9IHRvdGFsVmlydHVhbFNpemUgPiBjb250YWluZXJTaXplO1xuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSB1cGRhdGVCb3VuZHM6IHRvdGFsU2l6ZT0ke3RvdGFsVmlydHVhbFNpemV9LCBjb250YWluZXJTaXplPSR7Y29udGFpbmVyU2l6ZX0sIG5lZWRzU2Nyb2xsYmFyPSR7bmVlZHNTY3JvbGxiYXJ9YFxuICAgICAgLy8gKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmRpc3BsYXkgPSBuZWVkc1Njcm9sbGJhciA/IFwiYmxvY2tcIiA6IFwibm9uZVwiO1xuXG4gICAgICBpZiAobmVlZHNTY3JvbGxiYXIpIHtcbiAgICAgICAgbGV0IHNjcm9sbFJhdGlvOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBsb2FkZWRJdGVtc0NvdW50ID4gMCkge1xuICAgICAgICAgIC8vIEZvciBjdXJzb3IgbW9kZSwgdGh1bWIgc2l6ZSByZXByZXNlbnRzIGxvYWRlZCBjb250ZW50IHZzIGVzdGltYXRlZCB0b3RhbFxuICAgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgdG90YWwsIHVzZSBsb2FkZWQgaXRlbXMgKiAyIGFzIGVzdGltYXRlXG4gICAgICAgICAgY29uc3QgZXN0aW1hdGVkVG90YWwgPVxuICAgICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA+IDAgPyB0b3RhbFZpcnR1YWxTaXplIDogbG9hZGVkSXRlbXNDb3VudCAqIDI7XG4gICAgICAgICAgc2Nyb2xsUmF0aW8gPVxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSAvXG4gICAgICAgICAgICBNYXRoLm1heChlc3RpbWF0ZWRUb3RhbCwgbG9hZGVkSXRlbXNDb3VudCArIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vcm1hbCBjYWxjdWxhdGlvbiBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgICAgIHNjcm9sbFJhdGlvID0gY29udGFpbmVyU2l6ZSAvIHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHVtYkhlaWdodCA9IE1hdGgubWF4KHRodW1iTWluSGVpZ2h0LCBzY3JvbGxSYXRpbyAqIGNvbnRhaW5lclNpemUpO1xuICAgICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS5oZWlnaHQgPSBgJHt0aHVtYkhlaWdodH1weGA7XG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uKGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSAoc2Nyb2xsUG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVGh1bWIgfHwgIXNjcm9sbGJhclRyYWNrKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVEaXN0YW5jZSA9IHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgaWYgKHNjcm9sbGFibGVEaXN0YW5jZSA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gTWF0aC5taW4oXG4gICAgICAgIDEsXG4gICAgICAgIE1hdGgubWF4KDAsIHNjcm9sbFBvcyAvIHNjcm9sbGFibGVEaXN0YW5jZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0IC0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IHNjcm9sbFJhdGlvICogbWF4VGh1bWJQb3NpdGlvbjtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aHVtYlBvc2l0aW9ufXB4KWA7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0cmFjayBjbGlja1xuICAgIGNvbnN0IGhhbmRsZVRyYWNrQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIgfHwgZS50YXJnZXQgPT09IHNjcm9sbGJhclRodW1iKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRyYWNrUmVjdCA9IHNjcm9sbGJhclRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgY2xpY2tZID0gZS5jbGllbnRZIC0gdHJhY2tSZWN0LnRvcDtcbiAgICAgIGNvbnN0IHRodW1iQ2VudGVyWSA9IGNsaWNrWSAtIHRodW1iSGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IG1heFRodW1iUG9zaXRpb24gPSBjb250YWluZXJTaXplIC0gdGh1bWJIZWlnaHQ7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKHRodW1iQ2VudGVyWSwgbWF4VGh1bWJQb3NpdGlvbilcbiAgICAgICk7XG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHRodW1iUG9zaXRpb24gLyBtYXhUaHVtYlBvc2l0aW9uO1xuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9Qb3NpdGlvbih0YXJnZXRTY3JvbGxQb3NpdGlvbik7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzXG4gICAgY29uc3QgaGFuZGxlVGh1bWJNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBkcmFnU3RhcnRZID0gZS5jbGllbnRZO1xuICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIGFkZENsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBkcmFnIHN0YXJ0IGV2ZW50IHRvIG5vdGlmeSB2aWV3cG9ydFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIHN0YXJ0UG9zaXRpb246IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nIHx8ICFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gZHJhZ1N0YXJ0WTtcbiAgICAgIGNvbnN0IHRyYWNrSGVpZ2h0ID0gc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJIZWlnaHQgPSBzY3JvbGxiYXJUaHVtYi5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBtYXhUaHVtYlRyYXZlbCA9IHRyYWNrSGVpZ2h0IC0gdGh1bWJIZWlnaHQ7XG5cbiAgICAgIGlmIChtYXhUaHVtYlRyYXZlbCA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhUmF0aW8gPSBkZWx0YVkgLyBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIGNvbnN0IGRyYWdTdGFydFNjcm9sbFJhdGlvID1cbiAgICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gLyAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3U2Nyb2xsUmF0aW8gPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4oMSwgZHJhZ1N0YXJ0U2Nyb2xsUmF0aW8gKyBkZWx0YVJhdGlvKVxuICAgICAgKTtcblxuICAgICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uIGltbWVkaWF0ZWx5XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbmV3IHNjcm9sbCBwb3NpdGlvblxuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBuZXdTY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBNb3VzZSBtb3ZlOiBuZXdQb3M9JHtuZXdQb3NpdGlvbi50b0ZpeGVkKFxuICAgICAgLy8gICAgIDBcbiAgICAgIC8vICAgKX0sIGFuaW1hdGlvbkZyYW1lSWQ9JHthbmltYXRpb25GcmFtZUlkfWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIFRocm90dGxlIHZpZXdwb3J0IHVwZGF0ZXNcbiAgICAgIGlmIChhbmltYXRpb25GcmFtZUlkID09PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBSQUYgY2FsbGJhY2s6IHNjcm9sbGluZyB0byAke2xhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbn1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvUG9zaXRpb24obGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsYmFyXSBNb3VzZSB1cCAtIGVuZGluZyBkcmFnXCIpO1xuICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25GcmFtZUlkKTtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gIT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBlbmQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCB7XG4gICAgICAgIHNvdXJjZTogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgZW5kUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgfSk7XG5cbiAgICAgIGhpZGUoKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgdmlld3BvcnRFbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0YFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1Njcm9sbGJhcl0gTm8gdmlld3BvcnQgZWxlbWVudCBmb3VuZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIGAuJHtQUkVGSVh9LSR7VklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUn1gXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cygpO1xuICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjayAmJiB2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZVRyYWNrQ2xpY2spO1xuXG4gICAgICAgIGlmIChzY3JvbGxiYXJUaHVtYikge1xuICAgICAgICAgIHNjcm9sbGJhclRodW1iLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlVGh1bWJNb3VzZURvd24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHNob3csIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZWxlYXZlXCIsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSBoaWRlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHBhc3NpdmU6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCB2aWV3cG9ydCBzdGF0ZVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb25zdCBpbmZvID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZpZXdwb3J0SW5mbygpO1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplID0gaW5mby50b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICBjb250YWluZXJTaXplID0gaW5mby5jb250YWluZXJTaXplO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSAoY29tcG9uZW50IGFzIGFueSkuY29uZmlnO1xuICAgICAgICBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgICBzaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGRhdGEudG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGRhdGEuY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBsb2FkZWQgdG8gdXBkYXRlIHNjcm9sbGJhciBpbiBjdXJzb3IgbW9kZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgPSBkYXRhLmxvYWRlZENvdW50IHx8IDA7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBtb2RlKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBkYXRhLnRvdGFsKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHRoZSB0b3RhbCBpcyBkeW5hbWljXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1Njcm9sbGJhcl0gQ3Vyc29yIG1vZGU6IHVwZGF0aW5nIGJvdW5kcyBmb3IgbmV3IHRvdGFsICR7ZGF0YS50b3RhbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCb3VuZHModG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJJbml0aWFsaXplXCIsIGluaXRpYWxpemUpO1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCBpbml0aWFsaXplKTtcblxuICAgIC8vIENsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLnJlbW92ZSgpO1xuICAgICAgICBzY3JvbGxiYXJUcmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgICBzY3JvbGxiYXJUaHVtYiA9IG51bGw7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQgPSBudWxsO1xuICAgICAgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaGlkZVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KTtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJEZXN0cm95XCIsIGRlc3Ryb3kpO1xuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHNjcm9sbGJhcjogeyBzaG93LCBoaWRlLCB1cGRhdGVCb3VuZHMsIHVwZGF0ZVBvc2l0aW9uIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvY29sbGVjdGlvbi50c1xuXG4vKipcbiAqIENvbGxlY3Rpb24gRmVhdHVyZSAtIERhdGEgbWFuYWdlbWVudCBhbmQgcmFuZ2UgbG9hZGluZ1xuICogSGFuZGxlcyBjb2xsZWN0aW9uIGludGVncmF0aW9uLCBwYWdpbmF0aW9uLCBhbmQgZGF0YSBmZXRjaGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcERlc3Ryb3kgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db25maWcge1xuICBjb2xsZWN0aW9uPzogYW55OyAvLyBDb2xsZWN0aW9uIGFkYXB0ZXJcbiAgcmFuZ2VTaXplPzogbnVtYmVyOyAvLyBEZWZhdWx0IHJhbmdlIHNpemUgZm9yIGxvYWRpbmdcbiAgc3RyYXRlZ3k/OiBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiOyAvLyBMb2FkaW5nIHN0cmF0ZWd5XG4gIHRyYW5zZm9ybT86IChpdGVtOiBhbnkpID0+IGFueTsgLy8gSXRlbSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvblxuICBjYW5jZWxMb2FkVGhyZXNob2xkPzogbnVtYmVyOyAvLyBWZWxvY2l0eSB0aHJlc2hvbGQgZm9yIGNhbmNlbGxpbmcgbG9hZHNcbiAgbWF4Q29uY3VycmVudFJlcXVlc3RzPzogbnVtYmVyO1xuICBlbmFibGVSZXF1ZXN0UXVldWU/OiBib29sZWFuO1xuICBtYXhRdWV1ZVNpemU/OiBudW1iZXI7XG4gIGxvYWRPbkRyYWdFbmQ/OiBib29sZWFuOyAvLyBFbmFibGUgbG9hZGluZyB3aGVuIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjsgLy8gSW5pdGlhbCBzY3JvbGwgcG9zaXRpb24gKDAtYmFzZWQgaW5kZXgpXG4gIHNlbGVjdElkPzogc3RyaW5nIHwgbnVtYmVyOyAvLyBJRCBvZiBpdGVtIHRvIHNlbGVjdCBhZnRlciBpbml0aWFsIGxvYWQgY29tcGxldGVzXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGxvYWQgZGF0YSBvbiBpbml0aWFsaXphdGlvbiAoZGVmYXVsdDogdHJ1ZSlcbiAgYXV0b1NlbGVjdEZpcnN0PzogYm9vbGVhbjsgLy8gQXV0b21hdGljYWxseSBzZWxlY3QgZmlyc3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgKGRlZmF1bHQ6IGZhbHNlKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db21wb25lbnQge1xuICBjb2xsZWN0aW9uOiB7XG4gICAgbG9hZFJhbmdlOiAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpID0+IFByb21pc2U8YW55W10+O1xuICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRMb2FkZWRSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiB2b2lkO1xuICAgIHJldHJ5RmFpbGVkUmFuZ2U6IChyYW5nZUlkOiBudW1iZXIpID0+IFByb21pc2U8YW55W10+O1xuICAgIHNldFRvdGFsSXRlbXM6ICh0b3RhbDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IG51bWJlcjtcbiAgICAvLyBDdXJzb3Itc3BlY2lmaWMgbWV0aG9kc1xuICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IHN0cmluZyB8IG51bGw7XG4gICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gc3RyaW5nIHwgbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0eSB0byB2aWV3cG9ydCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbkNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiBDb2xsZWN0aW9uQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcmFuZ2VTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuREVGQVVMVF9SQU5HRV9TSVpFLFxuICAgICAgc3RyYXRlZ3kgPSBcIm9mZnNldFwiLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkNBTkNFTF9USFJFU0hPTEQsXG4gICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHMgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElOR1xuICAgICAgICAuTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFMsXG4gICAgICBlbmFibGVSZXF1ZXN0UXVldWUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5FTkFCTEVELFxuICAgICAgbWF4UXVldWVTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuTUFYX1FVRVVFX1NJWkUsXG4gICAgICBsb2FkT25EcmFnRW5kID0gdHJ1ZSwgLy8gRGVmYXVsdCB0byB0cnVlIGFzIHNhZmV0eSBtZWFzdXJlXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLCAvLyBTdGFydCBmcm9tIGJlZ2lubmluZyBieSBkZWZhdWx0XG4gICAgICBzZWxlY3RJZCwgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBhdXRvTG9hZCA9IHRydWUsIC8vIEF1dG8tbG9hZCBpbml0aWFsIGRhdGEgYnkgZGVmYXVsdFxuICAgICAgYXV0b1NlbGVjdEZpcnN0ID0gZmFsc2UsIC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGxpc3RlbmVyIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICBsZXQgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGhhc0luaXRpYWxTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleCA+IDA7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydCBDb2xsZWN0aW9uXSBJbml0aWFsaXplZCB3aXRoIGNvbmZpZzpcIiwge1xuICAgIC8vICAgc3RyYXRlZ3ksXG4gICAgLy8gICByYW5nZVNpemUsXG4gICAgLy8gICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgc3RhdGVcbiAgICBpbnRlcmZhY2UgUXVldWVkUmVxdWVzdCB7XG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiIHwgXCJub3JtYWxcIiB8IFwibG93XCI7XG4gICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIHRyYWNraW5nXG4gICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgbGV0IGFjdGl2ZUxvYWRDb3VudCA9IDA7XG4gICAgbGV0IGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICBsZXQgZmFpbGVkTG9hZHMgPSAwO1xuICAgIGxldCBjYW5jZWxsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gVHJhY2sgZHJhZyBzdGF0ZVxuXG4gICAgLy8gQ2FjaGUgZXZpY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IE1BWF9DQUNIRURfSVRFTVMgPSA1MDA7IC8vIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICBjb25zdCBFVklDVElPTl9CVUZGRVIgPSAxMDA7IC8vIEV4dHJhIGl0ZW1zIHRvIGtlZXAgYXJvdW5kIHZpc2libGUgcmFuZ2VcblxuICAgIC8vIE1lbW9yeSBkaWFnbm9zdGljc1xuICAgIGNvbnN0IGxvZ01lbW9yeVN0YXRzID0gKGNhbGxlcjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgbG9hZGVkUmFuZ2VDb3VudCA9IGxvYWRlZFJhbmdlcy5zaXplO1xuICAgICAgY29uc3QgcGVuZGluZ1JhbmdlQ291bnQgPSBwZW5kaW5nUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJDb3VudCA9IGFib3J0Q29udHJvbGxlcnMuc2l6ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZpY3QgaXRlbXMgZmFyIGZyb20gdGhlIGN1cnJlbnQgdmlzaWJsZSByYW5nZSB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAqIEtlZXBzIGl0ZW1zIHdpdGhpbiBFVklDVElPTl9CVUZGRVIgb2YgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBldmljdERpc3RhbnRJdGVtcyA9ICh2aXNpYmxlU3RhcnQ6IG51bWJlciwgdmlzaWJsZUVuZDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuXG4gICAgICAvLyBPbmx5IGV2aWN0IGlmIHdlIGhhdmUgbW9yZSB0aGFuIE1BWF9DQUNIRURfSVRFTVNcbiAgICAgIGlmIChpdGVtQ291bnQgPD0gTUFYX0NBQ0hFRF9JVEVNUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtlZXBTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVTdGFydCAtIEVWSUNUSU9OX0JVRkZFUik7XG4gICAgICBjb25zdCBrZWVwRW5kID0gdmlzaWJsZUVuZCArIEVWSUNUSU9OX0JVRkZFUjtcblxuICAgICAgbGV0IGV2aWN0ZWRDb3VudCA9IDA7XG4gICAgICBjb25zdCByYW5nZXNUb1JlbW92ZTogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gRmluZCBpdGVtcyB0byBldmljdFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXRlbXNbaV0gIT09IHVuZGVmaW5lZCAmJiAoaSA8IGtlZXBTdGFydCB8fCBpID4ga2VlcEVuZCkpIHtcbiAgICAgICAgICBkZWxldGUgaXRlbXNbaV07XG4gICAgICAgICAgZXZpY3RlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxvYWRlZFJhbmdlcyB0byByZWZsZWN0IGV2aWN0ZWQgZGF0YVxuICAgICAgbG9hZGVkUmFuZ2VzLmZvckVhY2goKHJhbmdlSWQpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZ2VTdGFydCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG4gICAgICAgIGNvbnN0IHJhbmdlRW5kID0gcmFuZ2VTdGFydCArIHJhbmdlU2l6ZSAtIDE7XG5cbiAgICAgICAgLy8gSWYgdGhpcyByYW5nZSBpcyBjb21wbGV0ZWx5IG91dHNpZGUgdGhlIGtlZXAgd2luZG93LCByZW1vdmUgaXRcbiAgICAgICAgaWYgKHJhbmdlRW5kIDwga2VlcFN0YXJ0IHx8IHJhbmdlU3RhcnQgPiBrZWVwRW5kKSB7XG4gICAgICAgICAgcmFuZ2VzVG9SZW1vdmUucHVzaChyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJhbmdlc1RvUmVtb3ZlLmZvckVhY2goKHJhbmdlSWQpID0+IHtcbiAgICAgICAgbG9hZGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXZpY3RlZENvdW50ID4gMCkge1xuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgdG8gYWxzbyBjbGVhbiB1cFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIHtcbiAgICAgICAgICBrZWVwU3RhcnQsXG4gICAgICAgICAga2VlcEVuZCxcbiAgICAgICAgICBldmljdGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhY3RpdmVMb2FkUmFuZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IGxvYWRSZXF1ZXN0UXVldWU6IFF1ZXVlZFJlcXVlc3RbXSA9IFtdO1xuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyIG1hcCBmb3IgY2FuY2VsbGluZyBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gbmV3IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj4oKTtcblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEl0ZW1zID0gMDtcbiAgICBsZXQgbG9hZGVkUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IHBlbmRpbmdSYW5nZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBsZXQgZmFpbGVkUmFuZ2VzID0gbmV3IE1hcDxcbiAgICAgIG51bWJlcixcbiAgICAgIHtcbiAgICAgICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICAgICAgbGFzdEVycm9yOiBFcnJvcjtcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9XG4gICAgPigpO1xuICAgIGxldCBhY3RpdmVSZXF1ZXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPGFueVtdPj4oKTtcblxuICAgIC8vIEN1cnNvciBwYWdpbmF0aW9uIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJzb3JNYXAgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpOyAvLyBNYXAgcGFnZSBudW1iZXIgdG8gY3Vyc29yXG4gICAgbGV0IHBhZ2VUb09mZnNldE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7IC8vIE1hcCBwYWdlIHRvIGFjdHVhbCBvZmZzZXRcbiAgICBsZXQgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgIGxldCBkaXNjb3ZlcmVkVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayBkaXNjb3ZlcmVkIHRvdGFsIGZyb20gQVBJXG4gICAgbGV0IGhhc1JlYWNoZWRFbmQgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIGRhdGFcblxuICAgIC8vIFNoYXJlIGl0ZW1zIGFycmF5IHdpdGggY29tcG9uZW50XG4gICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB1bmlxdWUgSUQgZm9yIGEgcmFuZ2UgYmFzZWQgb24gb2Zmc2V0IGFuZCB0aGUgYmFzZSByYW5nZSBzaXplXG4gICAgICovXG4gICAgY29uc3QgZ2V0UmFuZ2VJZCA9IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAvLyBBbHdheXMgdXNlIHRoZSBiYXNlIHJhbmdlU2l6ZSBmb3IgY29uc2lzdGVudCBJRHNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBtZXJnZWQgcmFuZ2VzIGNhbiBiZSB0cmFja2VkIHByb3Blcmx5XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihvZmZzZXQgLyByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgaGVscGVyc1xuICAgIGNvbnN0IGdldFJhbmdlS2V5ID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xuICAgIH07XG5cbiAgICBjb25zdCBjYW5Mb2FkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWZWxvY2l0eSA8PSBjYW5jZWxMb2FkVGhyZXNob2xkO1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZVJlcXVlc3RRdWV1ZSB8fCBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBTb3J0IHF1ZXVlIGJ5IHByaW9yaXR5IGFuZCB0aW1lc3RhbXBcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBwcmlvcml0eU9yZGVyID0geyBoaWdoOiAwLCBub3JtYWw6IDEsIGxvdzogMiB9O1xuICAgICAgICBjb25zdCBwcmlvcml0eURpZmYgPVxuICAgICAgICAgIHByaW9yaXR5T3JkZXJbYS5wcmlvcml0eV0gLSBwcmlvcml0eU9yZGVyW2IucHJpb3JpdHldO1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlEaWZmICE9PSAwID8gcHJpb3JpdHlEaWZmIDogYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJlcXVlc3RzIHVwIHRvIGNhcGFjaXR5XG4gICAgICB3aGlsZSAoXG4gICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbG9hZFJlcXVlc3RRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVRdWV1ZWRMb2FkID0gKHJlcXVlc3Q6IFF1ZXVlZFJlcXVlc3QpID0+IHtcbiAgICAgIGFjdGl2ZUxvYWRDb3VudCsrO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5hZGQoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhY3R1YWwgbG9hZE1pc3NpbmdSYW5nZXMgZnVuY3Rpb25cbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwocmVxdWVzdC5yYW5nZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbXBsZXRlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgIGZhaWxlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBhY3RpdmVMb2FkQ291bnQtLTtcbiAgICAgICAgICBhY3RpdmVMb2FkUmFuZ2VzLmRlbGV0ZShnZXRSYW5nZUtleShyZXF1ZXN0LnJhbmdlKSk7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gaXRlbXMgaWYgdHJhbnNmb3JtIGZ1bmN0aW9uIHByb3ZpZGVkXG4gICAgICovXG4gICAgY29uc3QgdHJhbnNmb3JtSXRlbXMgPSAocmF3SXRlbXM6IGFueVtdKTogYW55W10gPT4ge1xuICAgICAgaWYgKCF0cmFuc2Zvcm0pIHJldHVybiByYXdJdGVtcztcbiAgICAgIHJldHVybiByYXdJdGVtcy5tYXAodHJhbnNmb3JtKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHJhbmdlIG9mIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdCBsb2FkUmFuZ2UgPSBhc3luYyAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkUmFuZ2UgY2FsbGVkOiBvZmZzZXQ9JHtvZmZzZXR9LCBsaW1pdD0ke2xpbWl0fWAsXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW0NvbGxlY3Rpb25dIE5vIGNvbGxlY3Rpb24gYWRhcHRlciBjb25maWd1cmVkXCIpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhbmdlSWQgPSBnZXRSYW5nZUlkKG9mZnNldCwgbGltaXQpO1xuICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBSYW5nZSBJRDogJHtyYW5nZUlkfWApO1xuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGxvYWRlZFxuICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGFscmVhZHkgbG9hZGVkLCByZXR1cm5pbmcgY2FjaGVkIGRhdGFgLFxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gUmFuZ2UgJHtyYW5nZUlkfSBhbHJlYWR5IHBlbmRpbmdgKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdSZXF1ZXN0ID0gYWN0aXZlUmVxdWVzdHMuZ2V0KHJhbmdlSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJldHVybmluZyBleGlzdGluZyByZXF1ZXN0IGZvciByYW5nZSAke3JhbmdlSWR9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBNYXJraW5nIHJhbmdlICR7cmFuZ2VJZH0gYXMgcGVuZGluZyBhbmQgbG9hZGluZy4uLmAsXG4gICAgICAvLyApO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5hZGQocmFuZ2VJZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBBYm9ydENvbnRyb2xsZXIgZm9yIHRoaXMgcmVxdWVzdFxuICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgYWJvcnRDb250cm9sbGVycy5zZXQocmFuZ2VJZCwgYWJvcnRDb250cm9sbGVyKTtcblxuICAgICAgLy8gQ3JlYXRlIHJlcXVlc3QgcHJvbWlzZVxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIENhbGwgY29sbGVjdGlvbiBhZGFwdGVyIHdpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKG9mZnNldCAvIGxpbWl0KSArIDE7XG4gICAgICAgICAgbGV0IHBhcmFtczogYW55O1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb25cbiAgICAgICAgICAgIGlmIChwYWdlID09PSAxKSB7XG4gICAgICAgICAgICAgIC8vIEZpcnN0IHBhZ2UgLSBubyBjdXJzb3JcbiAgICAgICAgICAgICAgcGFyYW1zID0geyBsaW1pdCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBjdXJzb3IgZm9yIHByZXZpb3VzIHBhZ2VcbiAgICAgICAgICAgICAgY29uc3QgcHJldlBhZ2VDdXJzb3IgPSBjdXJzb3JNYXAuZ2V0KHBhZ2UgLSAxKTtcbiAgICAgICAgICAgICAgaWYgKCFwcmV2UGFnZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIC8vIENhbid0IGxvYWQgdGhpcyBwYWdlIHdpdGhvdXQgcHJldmlvdXMgY3Vyc29yXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gd2l0aG91dCBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFNlcXVlbnRpYWwgbG9hZGluZyByZXF1aXJlZCAtIG1pc3NpbmcgY3Vyc29yIGZvciBwYWdlICR7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgLSAxXG4gICAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBhcmFtcyA9IHsgY3Vyc29yOiBwcmV2UGFnZUN1cnNvciwgbGltaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInBhZ2VcIikge1xuICAgICAgICAgICAgcGFyYW1zID0geyBwYWdlLCBsaW1pdCB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBvZmZzZXQgc3RyYXRlZ3lcbiAgICAgICAgICAgIHBhcmFtcyA9IHsgb2Zmc2V0LCBsaW1pdCB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtWaWV3cG9ydCBDb2xsZWN0aW9uXSBMb2FkaW5nIHJhbmdlIG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9LCBzdHJhdGVneT0ke3N0cmF0ZWd5fSwgY2FsY3VsYXRlZCBwYWdlPSR7cGFnZX0sIHBhcmFtczpgLFxuICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBQYXNzIGFib3J0IHNpZ25hbCB0byB0aGUgYWRhcHRlciBpZiBpdCBzdXBwb3J0cyBpdFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29sbGVjdGlvbi5yZWFkKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgaXRlbXMgYW5kIHRvdGFsXG4gICAgICAgICAgY29uc3QgcmF3SXRlbXMgPSByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLml0ZW1zIHx8IHJlc3BvbnNlO1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSByZXNwb25zZS5tZXRhIHx8IHt9O1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB0cmFjayB0aGUgY3Vyc29yIChjaGVjayBib3RoIGN1cnNvciBhbmQgbmV4dEN1cnNvcilcbiAgICAgICAgICBjb25zdCByZXNwb25zZUN1cnNvciA9IG1ldGEuY3Vyc29yIHx8IG1ldGEubmV4dEN1cnNvcjtcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgcmVzcG9uc2VDdXJzb3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSByZXNwb25zZUN1cnNvcjtcbiAgICAgICAgICAgIGN1cnNvck1hcC5zZXQocGFnZSwgcmVzcG9uc2VDdXJzb3IpO1xuICAgICAgICAgICAgcGFnZVRvT2Zmc2V0TWFwLnNldChwYWdlLCBvZmZzZXQpO1xuICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSBNYXRoLm1heChoaWdoZXN0TG9hZGVkUGFnZSwgcGFnZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9yZWQgY3Vyc29yIGZvciBwYWdlICR7cGFnZX06ICR7cmVzcG9uc2VDdXJzb3J9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmIG1ldGEuaGFzTmV4dCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhhc1JlYWNoZWRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVhY2hlZCBlbmQgb2YgY3Vyc29yIHBhZ2luYXRpb24gYXQgcGFnZSAke3BhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGRpc2NvdmVyZWQgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbWV0YS50b3RhbDogJHttZXRhLnRvdGFsfSwgZGlzY292ZXJlZFRvdGFsIGJlZm9yZTogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChtZXRhLnRvdGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IG1ldGEudG90YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gZGlzY292ZXJlZFRvdGFsIGFmdGVyOiAke2Rpc2NvdmVyZWRUb3RhbH1gKTtcblxuICAgICAgICAgIC8vIFRyYW5zZm9ybSBpdGVtc1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSB0cmFuc2Zvcm1JdGVtcyhyYXdJdGVtcyk7XG5cbiAgICAgICAgICAvLyBBZGQgaXRlbXMgdG8gYXJyYXlcbiAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtc1tvZmZzZXQgKyBpbmRleF0gPSBpdGVtO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBzdHJhdGVneSwgY2FsY3VsYXRlIGR5bmFtaWMgdG90YWwgYmFzZWQgb24gbG9hZGVkIGRhdGFcbiAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICBsZXQgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcblxuICAgICAgICAgIC8vIENSSVRJQ0FMIEZJWDogV2hlbiBBUEkgcmV0dXJucyAwIGl0ZW1zIG9uIHBhZ2UgMSAob2Zmc2V0IDApLCB0aGUgbGlzdCBpcyBlbXB0eS5cbiAgICAgICAgICAvLyBXZSBtdXN0IHNldCB0b3RhbEl0ZW1zIHRvIDAgcmVnYXJkbGVzcyBvZiBtZXRhLnRvdGFsIGJlaW5nIHVuZGVmaW5lZC5cbiAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY291bnQ9ZmFsc2UgaXMgc2VudCBidXQgdGhlIGxpc3QgaXMgYWN0dWFsbHkgZW1wdHkuXG4gICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCAmJiB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gRW1wdHkgcmVzdWx0IG9uIHBhZ2UgMSAtIGZvcmNpbmcgdG90YWxJdGVtcyB0byAwYCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBuZXdUb3RhbCA9IDA7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbmV3VG90YWwgaW5pdGlhbDogJHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM6ICR7dG90YWxJdGVtc30sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJhc2VkIG9uIGxvYWRlZCBpdGVtcyArIG1hcmdpblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPSBoYXNSZWFjaGVkRW5kXG4gICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICA6IHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICAgIGNvbnN0IG1pblZpcnR1YWxJdGVtcyA9XG4gICAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG5cbiAgICAgICAgICAgIC8vIER5bmFtaWMgdG90YWw6IGxvYWRlZCBpdGVtcyArIG1hcmdpbiAodW5sZXNzIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZClcbiAgICAgICAgICAgIG5ld1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgKyBtYXJnaW5JdGVtcyxcbiAgICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ3Vyc29yIG1vZGUgdmlydHVhbCBzaXplOiBsb2FkZWQ9JHtsb2FkZWRJdGVtc0NvdW50fSwgbWFyZ2luPSR7bWFyZ2luSXRlbXN9LCB0b3RhbD0ke25ld1RvdGFsfSwgaGFzUmVhY2hlZEVuZD0ke2hhc1JlYWNoZWRFbmR9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0b3RhbCBpZiBpdCBoYXMgZ3Jvd25cbiAgICAgICAgICAgIGlmIChuZXdUb3RhbCA+IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke25ld1RvdGFsfWAsXG4gICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgIHRvdGFsSXRlbXMgPSBuZXdUb3RhbDtcbiAgICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvciBvdGhlciBzdHJhdGVnaWVzLCB1c2UgZGlzY292ZXJlZCB0b3RhbCBvciBjdXJyZW50IHRvdGFsXG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICAgIG5ld1RvdGFsID0gZGlzY292ZXJlZFRvdGFsID8/IHRvdGFsSXRlbXM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIHN0YXRlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEJlZm9yZSBzdGF0ZSB1cGRhdGU6IG5ld1RvdGFsPSR7bmV3VG90YWx9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIHdpbGwgdXBkYXRlOiAke25ld1RvdGFsICE9PSB0b3RhbEl0ZW1zfWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobmV3VG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gQ2FsbGluZyBzZXRUb3RhbEl0ZW1zKCR7bmV3VG90YWx9KWApO1xuICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBpdGVtcyByZWZlcmVuY2VcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgICAgICAgIC8vIEVtaXQgaXRlbXMgY2hhbmdlZCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IG5ld1RvdGFsLFxuICAgICAgICAgICAgbG9hZGVkQ291bnQ6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgbmV3VG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gbmV3VG90YWwgPz8gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgYXMgbG9hZGVkXG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJhbmdlICR7cmFuZ2VJZH0gbG9hZGVkIHN1Y2Nlc3NmdWxseSB3aXRoICR7dHJhbnNmb3JtZWRJdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBMb2cgbWVtb3J5IHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgNSBsb2FkcylcbiAgICAgICAgICBpZiAoY29tcGxldGVkTG9hZHMgJSA1ID09PSAwKSB7XG4gICAgICAgICAgICBsb2dNZW1vcnlTdGF0cyhgbG9hZDoke2NvbXBsZXRlZExvYWRzfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBjb2xsZWN0aW9uIGxvYWRlZCBldmVudCB3aXRoIG1vcmUgZGV0YWlsc1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgICAgcmFuZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1zSW5NZW1vcnk6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgICBjdXJzb3I6IHN0cmF0ZWd5ID09PSBcImN1cnNvclwiID8gY3VycmVudEN1cnNvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgdmlld3BvcnQgdXBkYXRlXG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py51cGRhdGVWaWV3cG9ydD8uKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRJdGVtcztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgQWJvcnRFcnJvciBhbmQgXCJGYWlsZWQgdG8gZmV0Y2hcIiAod2hpY2ggY2FuIG9jY3VyIG9uIGFib3J0KSBncmFjZWZ1bGx5XG4gICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgIChlcnJvciBhcyBFcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgfHxcbiAgICAgICAgICAgICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPT09IFwiRmFpbGVkIHRvIGZldGNoXCIgJiZcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKTtcblxuICAgICAgICAgIGlmIChpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgIC8vIERvbid0IHRocm93LCBqdXN0IHJldHVybiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnNcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuXG4gICAgICAgICAgY29uc3QgYXR0ZW1wdHMgPSAoZmFpbGVkUmFuZ2VzLmdldChyYW5nZUlkKT8uYXR0ZW1wdHMgfHwgMCkgKyAxO1xuICAgICAgICAgIGZhaWxlZFJhbmdlcy5zZXQocmFuZ2VJZCwge1xuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1lcnJvclwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVSZXF1ZXN0cy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGFjdGl2ZVJlcXVlc3RzLnNldChyYW5nZUlkLCByZXF1ZXN0UHJvbWlzZSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFByb21pc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgbWlzc2luZyByYW5nZXMgZnJvbSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCA9IGFzeW5jIChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsIC0gcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbmVlZCB0byBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFnZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgZW5kUGFnZSA9IE1hdGguZmxvb3IocmFuZ2UuZW5kIC8gcmFuZ2VTaXplKSArIDE7XG5cbiAgICAgICAgLy8gTGltaXQgaG93IG1hbnkgcGFnZXMgd2UnbGwgbG9hZCBhdCBvbmNlXG4gICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRIaWdoZXN0UGFnZSA9IGhpZ2hlc3RMb2FkZWRQYWdlIHx8IDA7XG4gICAgICAgIGNvbnN0IGxpbWl0ZWRFbmRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgZW5kUGFnZSxcbiAgICAgICAgICBjdXJyZW50SGlnaGVzdFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEN1cnNvciBtb2RlOiBuZWVkIHRvIGxvYWQgcGFnZXMgJHtzdGFydFBhZ2V9IHRvICR7ZW5kUGFnZX0sIGxpbWl0ZWQgdG8gJHtsaW1pdGVkRW5kUGFnZX1gLFxuICAgICAgICAvLyApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gbG9hZCBwYWdlcyBzZXF1ZW50aWFsbHlcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IHN0YXJ0UGFnZTsgcGFnZSA8PSBsaW1pdGVkRW5kUGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgY29uc3QgcmFuZ2VJZCA9IHBhZ2UgLSAxOyAvLyBDb252ZXJ0IHRvIDAtYmFzZWQgcmFuZ2VJZFxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG5cbiAgICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBSYW5nZSBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbXVzdCBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgcHJldmlvdXMgcGFnZXMgbG9hZGVkXG4gICAgICAgICAgICBpZiAocGFnZSA+IDEpIHtcbiAgICAgICAgICAgICAgbGV0IGNhbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICBmb3IgKGxldCBwcmV2UGFnZSA9IDE7IHByZXZQYWdlIDwgcGFnZTsgcHJldlBhZ2UrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZSYW5nZUlkID0gcHJldlBhZ2UgLSAxO1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhwcmV2UmFuZ2VJZCkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSAtIG5lZWQgdG8gbG9hZCBwYWdlICR7cHJldlBhZ2V9IGZpcnN0YCxcbiAgICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgICBjYW5Mb2FkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSBtaXNzaW5nIHBhZ2VcbiAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ1Jhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKHByZXZSYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHByZXJlcXVpc2l0ZSBwYWdlICR7cHJldlBhZ2V9OmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU3RvcCB0cnlpbmcgdG8gbG9hZCBmdXJ0aGVyIHBhZ2VzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghY2FuTG9hZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFnZSBmb3Igbm93XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKG9mZnNldCwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwYWdlICR7cGFnZX06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICBicmVhazsgLy8gU3RvcCBzZXF1ZW50aWFsIGxvYWRpbmcgb24gZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kUGFnZSA+IGxpbWl0ZWRFbmRQYWdlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3BwZWQgYXQgcGFnZSAke2xpbWl0ZWRFbmRQYWdlfSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBsb2FkaW5nIChyZXF1ZXN0ZWQgdXAgdG8gJHtlbmRQYWdlfSlgLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9yaWdpbmFsIGxvZ2ljIGZvciBvZmZzZXQvcGFnZSBzdHJhdGVnaWVzXG4gICAgICAvLyBDYWxjdWxhdGUgcmFuZ2UgYm91bmRhcmllc1xuICAgICAgY29uc3Qgc3RhcnRSYW5nZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpO1xuICAgICAgY29uc3QgZW5kUmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIHBhZ2Ugc3RyYXRlZ3kgLSBzdGFydFJhbmdlOiAke3N0YXJ0UmFuZ2V9LCBlbmRSYW5nZTogJHtlbmRSYW5nZX0sIGxvYWRlZFJhbmdlczogWyR7QXJyYXkuZnJvbShsb2FkZWRSYW5nZXMpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIENvbGxlY3QgcmFuZ2VzIHRoYXQgbmVlZCBsb2FkaW5nXG4gICAgICBjb25zdCByYW5nZXNUb0xvYWQ6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICByYW5nZXNUb0xvYWQucHVzaChyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSByYW5nZXNUb0xvYWQ6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XSwgcGVuZGluZ1JhbmdlczogWyR7QXJyYXkuZnJvbShwZW5kaW5nUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAocmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIE5vIHJhbmdlcyB0byBsb2FkIC0gYWxsIGxvYWRlZCBvciBwZW5kaW5nYCk7XG4gICAgICAgIC8vIEFsbCByYW5nZXMgYXJlIGFscmVhZHkgbG9hZGVkIG9yIHBlbmRpbmdcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHF1ZXVlZCByZXF1ZXN0cyB3ZSBzaG91bGQgcHJvY2Vzc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gTG9hZGluZyAke3Jhbmdlc1RvTG9hZC5sZW5ndGh9IHJhbmdlczogWyR7cmFuZ2VzVG9Mb2FkLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIExvYWQgcmFuZ2VzIGluZGl2aWR1YWxseSAtIG5vIG1lcmdpbmcgdG8gYXZvaWQgbG9hZGluZyBvbGQgcmFuZ2VzXG4gICAgICBjb25zdCBwcm9taXNlcyA9IHJhbmdlc1RvTG9hZC5tYXAoKHJhbmdlSWQpID0+XG4gICAgICAgIGxvYWRSYW5nZShyYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlbG9jaXR5LWF3YXJlIHdyYXBwZXIgZm9yIGxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXMgPSAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByYW5nZUtleSA9IGdldFJhbmdlS2V5KHJhbmdlKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRNaXNzaW5nUmFuZ2VzIGNhbGxlZCAtIHJhbmdlOiAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH0sIGNhbGxlcjogJHtjYWxsZXJ9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkLCBza2lwcGluZ2ApO1xuICAgICAgICAgIC8vIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgd2l0aCBsb3cgdmVsb2NpdHkgKGJ1dCBub3QgaWYgd2UncmUgaWRsZSlcbiAgICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgY3VycmVudFZlbG9jaXR5IDwgMC41ICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIFwiW0NvbGxlY3Rpb25dIExvYWQgc2tpcHBlZCAtIGFjdGl2ZWx5IGRyYWdnaW5nIHdpdGggbG93IHZlbG9jaXR5XCJcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBMb2FkIGNhbmNlbGxlZCAtIHZlbG9jaXR5ICR7Y3VycmVudFZlbG9jaXR5LnRvRml4ZWQoXG4gICAgICAgICAgLy8gICAgIDJcbiAgICAgICAgICAvLyAgICl9IGV4Y2VlZHMgdGhyZXNob2xkICR7Y2FuY2VsTG9hZFRocmVzaG9sZH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjYXBhY2l0eVxuICAgICAgICBpZiAoYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzKSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSAmJlxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIDwgbWF4UXVldWVTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSByZXF1ZXN0XG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtMb2FkaW5nTWFuYWdlcl0gUXVldWVkIHJlcXVlc3QgKGF0IGNhcGFjaXR5KSwgcXVldWUgc2l6ZTogJHtsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBRdWV1ZSBvdmVyZmxvdyAtIHJlc29sdmUgdG8gYXZvaWQgZXJyb3JzXG4gICAgICAgICAgaWYgKGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID49IG1heFF1ZXVlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCAtIG1heFF1ZXVlU2l6ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZW1vdmVkLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0cnkgYSBmYWlsZWQgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCByZXRyeUZhaWxlZFJhbmdlID0gYXN5bmMgKHJhbmdlSWQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIGZhaWxlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgcmV0dXJuIGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0b3RhbCBpdGVtcyBjb3VudFxuICAgICAqL1xuICAgIGNvbnN0IHNldFRvdGFsSXRlbXMgPSAodG90YWw6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgdG90YWxJdGVtcyA9IHRvdGFsO1xuXG4gICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGUncyB0b3RhbCBpdGVtc1xuICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsO1xuICAgICAgfVxuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCB7IHRvdGFsIH0pO1xuICAgIH07XG5cbiAgICAvLyBIb29rIGludG8gdmlld3BvcnQgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHRvdGFsIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMpIHtcbiAgICAgICAgdG90YWxJdGVtcyA9IGNvbXBvbmVudC50b3RhbEl0ZW1zO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGRyYWcgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctZW5kXCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAvLyBQcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHMgYWZ0ZXIgZHJhZyBlbmRzIChzYWZldHkgbWVhc3VyZSlcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHBsYWNlaG9sZGVycyBhcmUgcmVwbGFjZWQgZXZlbiBpZiBpZGxlIGRldGVjdGlvbiBmYWlsc1xuICAgICAgICBpZiAobG9hZE9uRHJhZ0VuZCkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBsb2FkIGR1cmluZyBmYXN0IHNjcm9sbGluZyAtIGxvYWRNaXNzaW5nUmFuZ2VzIHdpbGwgaGFuZGxlIHZlbG9jaXR5IGNoZWNrXG5cbiAgICAgICAgLy8gRXh0cmFjdCByYW5nZSBmcm9tIGV2ZW50IGRhdGEgLSB2aXJ0dWFsIGZlYXR1cmUgZW1pdHMgeyByYW5nZTogeyBzdGFydCwgZW5kIH0sIHNjcm9sbFBvc2l0aW9uIH1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkYXRhLnJhbmdlIHx8IGRhdGE7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2U7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgYmVmb3JlIGxvYWRpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZW5kICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gSW52YWxpZCByYW5nZSBpbiB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW50OlwiLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWwgbG9hZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGluIHZpcnR1YWwudHMgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSAxIGxvYWRcbiAgICAgICAgLy8gYWZ0ZXIgd2UndmUgYWxyZWFkeSBzdGFydGVkIGxvYWRpbmcgdGhlIGNvcnJlY3QgaW5pdGlhbCBwYWdlXG4gICAgICAgIGlmIChoYXNJbml0aWFsU2Nyb2xsSW5kZXggJiYgIWhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQpIHtcbiAgICAgICAgICBjb25zdCBwYWdlMUVuZEluZGV4ID0gcmFuZ2VTaXplIC0gMTsgLy8gZS5nLiwgMjkgZm9yIHJhbmdlU2l6ZT0zMFxuICAgICAgICAgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPD0gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgZm9yIHBhZ2UgMSwgc2tpcCBpdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgbWlzc2luZyByYW5nZXMgaWYgbmVlZGVkXG4gICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIik7XG5cbiAgICAgICAgLy8gRXZpY3QgZGlzdGFudCBpdGVtcyB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAgICBldmljdERpc3RhbnRJdGVtcyhzdGFydCwgZW5kKTtcblxuICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgIWhhc1JlYWNoZWRFbmQpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9XG4gICAgICAgICAgICByYW5nZVNpemUgKlxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICBjb25zdCBtaW5WaXJ0dWFsSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgZHluYW1pY1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ICsgbWFyZ2luSXRlbXMsXG4gICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChkeW5hbWljVG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7ZHluYW1pY1RvdGFsfWAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhkeW5hbWljVG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmVsb2NpdHkgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWZWxvY2l0eSA9IGN1cnJlbnRWZWxvY2l0eTtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gTWF0aC5hYnMoZGF0YS52ZWxvY2l0eSB8fCAwKTtcblxuICAgICAgICAvLyBXaGVuIHZlbG9jaXR5IGRyb3BzIGJlbG93IHRocmVzaG9sZCwgcHJvY2VzcyBxdWV1ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldmlvdXNWZWxvY2l0eSA+IGNhbmNlbExvYWRUaHJlc2hvbGQgJiZcbiAgICAgICAgICBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaWRsZSBzdGF0ZSB0byBwcm9jZXNzIHF1ZXVlXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmlkbGVcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiW0NvbGxlY3Rpb25dIElkbGUgZXZlbnQgcmVjZWl2ZWQsIHZlbG9jaXR5PTBcIik7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IDA7XG5cbiAgICAgICAgLy8gUmVzZXQgZHJhZ2dpbmcgc3RhdGUgb24gaWRsZSBzaW5jZSB1c2VyIGhhcyBzdG9wcGVkIG1vdmluZ1xuICAgICAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW0NvbGxlY3Rpb25dIFJlc2V0dGluZyBkcmFnIHN0YXRlIG9uIGlkbGVcIik7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgdmlzaWJsZSByYW5nZSBvbiBpZGxlOiAke3Zpc2libGVSYW5nZS5zdGFydH0tJHt2aXNpYmxlUmFuZ2UuZW5kfWBcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVtb3Zpbmcgc3RhbGUgcXVldWVkIHJlcXVlc3Q6ICR7cmVxdWVzdFN0YXJ0fS0ke3JlcXVlc3RFbmR9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7IC8vIFJlc29sdmUgdG8gYXZvaWQgaGFuZ2luZyBwcm9taXNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzUmVsZXZhbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBjdXJyZW50IHZpc2libGUgcmFuZ2UgaWYgbmVlZGVkXG4gICAgICAgICAgYXdhaXQgbG9hZE1pc3NpbmdSYW5nZXModmlzaWJsZVJhbmdlLCBcInZpZXdwb3J0OmlkbGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbHNvIHByb2Nlc3MgYW55IHF1ZXVlZCByZXF1ZXN0c1xuICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gcmVtb3ZhbCAtIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlbG9hZFxuICAgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBzaGlmdGVkIGxvY2FsbHkgaW4gYXBpLnRzIGFuZCByZW5kZXJpbmcudHNcbiAgICAgIC8vIFJlbG9hZGluZyB3b3VsZCBjYXVzZSByYWNlIGNvbmRpdGlvbnMgYW5kIG92ZXJ3cml0ZSB0aGUgY29ycmVjdCB0b3RhbEl0ZW1zXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06cmVtb3ZlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbTpyZW1vdmVkIGV2ZW50IC0gaW5kZXg6ICR7ZGF0YS5pbmRleH1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBpdGVtcy5sZW5ndGg6ICR7aXRlbXMubGVuZ3RofWApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNjb3ZlcmVkVG90YWwgdG8gbWF0Y2ggdGhlIG5ldyBjb3VudFxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHN0YWxlIGRpc2NvdmVyZWRUb3RhbCBmcm9tIGJlaW5nIHVzZWQgb24gbmV4dCBsb2FkXG4gICAgICAgIGlmIChkaXNjb3ZlcmVkVG90YWwgIT09IG51bGwgJiYgZGlzY292ZXJlZFRvdGFsID4gMCkge1xuICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCAtIDE7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0ZWQgZGlzY292ZXJlZFRvdGFsIHRvOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBEbyBOT1QgZGVjcmVtZW50IHRvdGFsSXRlbXMgaGVyZSFcbiAgICAgICAgLy8gYXBpLnRzIGFscmVhZHkgY2FsbHMgc2V0VG90YWxJdGVtcygpIGFmdGVyIGVtaXR0aW5nIGl0ZW06cmVtb3ZlLXJlcXVlc3QsXG4gICAgICAgIC8vIHdoaWNoIHByb3Blcmx5IHVwZGF0ZXMgdG90YWxJdGVtcy4gRGVjcmVtZW50aW5nIGhlcmUgd291bGQgY2F1c2UgYSBkb3VibGUtZGVjcmVtZW50LlxuXG4gICAgICAgIC8vIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyAtIHdlIHdhbnQgdG8ga2VlcCB1c2luZyB0aGUgbG9jYWwgZGF0YVxuICAgICAgICAvLyBUaGUgZGF0YSBoYXMgYmVlbiBzaGlmdGVkIGxvY2FsbHkgYW5kIGlzIHN0aWxsIHZhbGlkXG4gICAgICAgIC8vIENsZWFyaW5nIHdvdWxkIHRyaWdnZXIgYSByZWxvYWQgd2hpY2ggY2F1c2VzIHJhY2UgY29uZGl0aW9uc1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEtlZXBpbmcgbG9hZGVkUmFuZ2VzIGludGFjdDpgLFxuICAgICAgICAvLyAgIEFycmF5LmZyb20obG9hZGVkUmFuZ2VzKSxcbiAgICAgICAgLy8gKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2FkIGluaXRpYWwgZGF0YSBpZiBjb2xsZWN0aW9uIGlzIGF2YWlsYWJsZSBhbmQgYXV0b0xvYWQgaXMgZW5hYmxlZFxuICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgYXV0b0xvYWQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCBPUiBhIHNlbGVjdElkLCBsb2FkIGRhdGEgZm9yIHRoYXQgcG9zaXRpb24gZGlyZWN0bHlcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHNjcm9sbFRvSW5kZXgoKSBhcyBpdCB0cmlnZ2VycyBhbmltYXRpb24vdmVsb2NpdHkgdHJhY2tpbmdcbiAgICAgICAgLy8gdmlydHVhbC50cyBoYXMgYWxyZWFkeSBzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgY2FsY3VsYXRlZCB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCB8fFxuICAgICAgICAgIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdElkICE9PSBudWxsKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHZpc2libGUgcmFuZ2UgdGhhdCB3YXMgYWxyZWFkeSBjYWxjdWxhdGVkIGJ5IHZpcnR1YWwudHNcbiAgICAgICAgICAvLyBXZSBtaXNzZWQgdGhlIGluaXRpYWwgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudCBiZWNhdXNlIG91ciBsaXN0ZW5lciB3YXNuJ3QgcmVhZHkgeWV0XG4gICAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlICYmXG4gICAgICAgICAgICAodmlzaWJsZVJhbmdlLnN0YXJ0ID4gMCB8fCB2aXNpYmxlUmFuZ2UuZW5kID4gMClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgcHJlLWNhbGN1bGF0ZWQgdmlzaWJsZSByYW5nZSBmcm9tIHZpcnR1YWwudHNcbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJpbml0aWFsLXBvc2l0aW9uXCIpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIHNlbGVjdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZCBpZiBzZWxlY3RJZCBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgcG9zaXRpb24gZGF0YTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBjYWxjdWxhdGUgcmFuZ2UgZnJvbSBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyBlZGdlIGNhc2VzIHdoZXJlIHZpc2libGVSYW5nZSB3YXNuJ3QgcmVhZHlcbiAgICAgICAgICAgIGNvbnN0IG92ZXJzY2FuID0gMjtcbiAgICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFZpc2libGVDb3VudCA9IE1hdGguY2VpbCg2MDAgLyA1MCk7IC8vIH4xMiBpdGVtc1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBpbml0aWFsU2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcblxuICAgICAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXMoeyBzdGFydCwgZW5kIH0sIFwiaW5pdGlhbC1wb3NpdGlvbi1mYWxsYmFja1wiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGEgKGZhbGxiYWNrKTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGluaXRpYWwgc2Nyb2xsIGluZGV4IC0gbG9hZCBmcm9tIGJlZ2lubmluZyBhcyBub3JtYWxcbiAgICAgICAgbG9hZFJhbmdlKDAsIHJhbmdlU2l6ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYXV0b1NlbGVjdEZpcnN0IC0gZ2V0IGZpcnN0IGl0ZW0gSUQgYW5kIGVtaXQgc2VsZWN0aW9uIGV2ZW50XG4gICAgICAgICAgICBpZiAoYXV0b1NlbGVjdEZpcnN0ICYmIGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SWQgPSBmaXJzdEl0ZW0/Ll9pZCB8fCBmaXJzdEl0ZW0/LmlkO1xuICAgICAgICAgICAgICBpZiAoZmlyc3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdElkOiBmaXJzdElkLFxuICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgZGF0YTpcIiwgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBBUEkgdG8gdmlld3BvcnRcbiAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbiA9IHtcbiAgICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBsb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCksXG4gICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJ2aWV3cG9ydC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IGZhaWxlZFJhbmdlcy5jbGVhcigpLFxuICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiB0b3RhbEl0ZW1zLFxuICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBjdXJzb3JNYXAuZ2V0KHBhZ2UpIHx8IG51bGwsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICB9O1xuXG4gICAgLy8gQWxzbyBlbnN1cmUgY29tcG9uZW50Lml0ZW1zIGlzIHVwZGF0ZWRcbiAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb24gLSBjb21wcmVoZW5zaXZlIG1lbW9yeSBjbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTpiZWZvcmVcIik7XG5cbiAgICAgIC8vIEFib3J0IGFsbCBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBhYm9ydCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHN0cnVjdHVyZXNcbiAgICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmdSYW5nZXMuY2xlYXIoKTtcbiAgICAgIGZhaWxlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlUmVxdWVzdHMuY2xlYXIoKTtcbiAgICAgIGN1cnNvck1hcC5jbGVhcigpO1xuICAgICAgcGFnZVRvT2Zmc2V0TWFwLmNsZWFyKCk7XG5cbiAgICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgICB0b3RhbEl0ZW1zID0gMDtcbiAgICAgIGN1cnJlbnRDdXJzb3IgPSBudWxsO1xuICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgICAgZGlzY292ZXJlZFRvdGFsID0gbnVsbDtcbiAgICAgIGhhc1JlYWNoZWRFbmQgPSBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgY29tcG9uZW50IHJlZmVyZW5jZVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcyA9PT0gaXRlbXMpIHtcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gW107XG4gICAgICB9XG5cbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTphZnRlclwiKTtcbiAgICB9O1xuXG4gICAgLy8gV2lyZSBkZXN0cm95IGludG8gdGhlIGNvbXBvbmVudCdzIGRlc3Ryb3kgY2hhaW5cbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgIC8vIERhdGEgYWNjZXNzIG1ldGhvZHNcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIGdldEl0ZW1zOiAoKSA9PiBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgICAgLy8gTG9hZGluZyBtZXRob2RzXG4gICAgICAgIGxvYWRSYW5nZSxcbiAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwicmV0dXJuLmNvbGxlY3Rpb25cIiksXG4gICAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgICBjbGVhckZhaWxlZFJhbmdlczogKCkgPT4gZmFpbGVkUmFuZ2VzLmNsZWFyKCksXG4gICAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IHRvdGFsSXRlbXMsXG4gICAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgRmVhdHVyZSAtIFNtYXJ0IHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqIEFuYWx5emVzIGZpcnN0IGxvYWRlZCBkYXRhIHRvIGdlbmVyYXRlIHJlYWxpc3RpYyBtYXNrZWQgcGxhY2Vob2xkZXJzXG4gKiBTaG93cyBwbGFjZWhvbGRlcnMgd2hpbGUgZGF0YSBpcyBsb2FkaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwbGFjZWhvbGRlciBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYW5hbHl6ZUZpcnN0TG9hZD86IGJvb2xlYW47XG4gIG1hc2tDaGFyYWN0ZXI/OiBzdHJpbmc7XG4gIHJhbmRvbUxlbmd0aFZhcmlhbmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWVsZCBzdHJ1Y3R1cmUgZm9yIHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqL1xuaW50ZXJmYWNlIEZpZWxkU3RydWN0dXJlIHtcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xuICBhdmdMZW5ndGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbXBvbmVudCB7XG4gIHBsYWNlaG9sZGVyczoge1xuICAgIGFuYWx5emVEYXRhU3RydWN0dXJlOiAoaXRlbXM6IGFueVtdKSA9PiB2b2lkO1xuICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBib29sZWFuO1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gYW55O1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IGFueVtdO1xuICAgIHNob3dQbGFjZWhvbGRlcnM6IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgIGlzUGxhY2Vob2xkZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG4gICAgcmVwbGFjZVBsYWNlaG9sZGVyczogKGl0ZW1zOiBhbnlbXSwgb2Zmc2V0OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBsYWNlaG9sZGVycyhjb25maWc6IFBsYWNlaG9sZGVyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgQ29sbGVjdGlvbkNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBUXG4gICk6IFQgJiBQbGFjZWhvbGRlckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhbmFseXplRmlyc3RMb2FkID0gdHJ1ZSxcbiAgICAgIG1hc2tDaGFyYWN0ZXIgPSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIsXG4gICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUlxuICAgICAgICAuUkFORE9NX0xFTkdUSF9WQVJJQU5DRSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgZmllbGRTdHJ1Y3R1cmVzOiBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgcGxhY2Vob2xkZXJJZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGZpcnN0IGxvYWRlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGFuYWx5emVEYXRhU3RydWN0dXJlID0gKGl0ZW1zOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkIHx8IGhhc0FuYWx5emVkIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYPCflI0gW1BMQUNFSE9MREVSU10gQW5hbHl6aW5nIGRhdGEgc3RydWN0dXJlIGZyb20gJHtpdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgLy8gKTtcblxuICAgICAgY29uc3Qgc3RydWN0dXJlcyA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4oKTtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFYX1NBTVBMRV9TSVpFXG4gICAgICApO1xuXG4gICAgICAvLyBBbmFseXplIGVhY2ggZmllbGQgYWNyb3NzIGFsbCBzYW1wbGUgaXRlbXNcbiAgICAgIGNvbnN0IGZpZWxkU3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcblxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgaW50ZXJuYWwgZmllbGRzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmllbGQuc3RhcnRzV2l0aChcIl9cIikgfHxcbiAgICAgICAgICAgIGZpZWxkID09PSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGl0ZW1bZmllbGRdIHx8IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghZmllbGRTdGF0cy5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZFN0YXRzLnNldChmaWVsZCwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZFN0YXRzLmdldChmaWVsZCkhLnB1c2gobGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBlYWNoIGZpZWxkXG4gICAgICBmaWVsZFN0YXRzLmZvckVhY2goKGxlbmd0aHMsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChsZW5ndGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IE1hdGgubWluKC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5sZW5ndGhzKTtcbiAgICAgICAgY29uc3QgYXZnTGVuZ3RoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBsZW5ndGhzLnJlZHVjZSgoc3VtLCBsZW4pID0+IHN1bSArIGxlbiwgMCkgLyBsZW5ndGhzLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHN0cnVjdHVyZXMuc2V0KGZpZWxkLCB7XG4gICAgICAgICAgbWluTGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aCxcbiAgICAgICAgICBhdmdMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkU3RydWN0dXJlcyA9IHN0cnVjdHVyZXM7XG4gICAgICBoYXNBbmFseXplZCA9IHRydWU7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg4pyFIFtQTEFDRUhPTERFUlNdIFN0cnVjdHVyZSBhbmFseXplZDpgLFxuICAgICAgLy8gICBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcylcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc3RydWN0dXJlLWFuYWx5emVkXCIsIHtcbiAgICAgICAgc3RydWN0dXJlOiBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW5nbGUgcGxhY2Vob2xkZXIgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtID0gKGluZGV4OiBudW1iZXIpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtwbGFjZWhvbGRlcklkQ291bnRlcisrfWAsXG4gICAgICAgIFtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR106IHRydWUsXG4gICAgICAgIF9pbmRleDogaW5kZXgsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZpZWxkU3RydWN0dXJlcyB8fCBmaWVsZFN0cnVjdHVyZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBObyBzdHJ1Y3R1cmUgYW5hbHl6ZWQgeWV0IC0gcmV0dXJuIGJhc2ljIHBsYWNlaG9sZGVyXG4gICAgICAgIHBsYWNlaG9sZGVyLmxhYmVsID0gbWFza0NoYXJhY3Rlci5yZXBlYXQoMTApO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIGZpZWxkcyBiYXNlZCBvbiBhbmFseXplZCBzdHJ1Y3R1cmVcbiAgICAgIGZpZWxkU3RydWN0dXJlcy5mb3JFYWNoKChzdHJ1Y3R1cmUsIGZpZWxkKSA9PiB7XG4gICAgICAgIGxldCBsZW5ndGg6IG51bWJlcjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmFuZG9tTGVuZ3RoVmFyaWFuY2UgJiZcbiAgICAgICAgICBzdHJ1Y3R1cmUubWluTGVuZ3RoICE9PSBzdHJ1Y3R1cmUubWF4TGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFJhbmRvbSBsZW5ndGggd2l0aGluIHJhbmdlXG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKiAoc3RydWN0dXJlLm1heExlbmd0aCAtIHN0cnVjdHVyZS5taW5MZW5ndGggKyAxKSArXG4gICAgICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSBhdmVyYWdlIGxlbmd0aFxuICAgICAgICAgIGxlbmd0aCA9IHN0cnVjdHVyZS5hdmdMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBzb21lIHZhcmlhdGlvbiB0byBtYWtlIGl0IGxvb2sgbW9yZSBuYXR1cmFsXG4gICAgICAgIGlmIChyYW5kb21MZW5ndGhWYXJpYW5jZSAmJiBNYXRoLnJhbmRvbSgpIDwgMC4zKSB7XG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgoMSwgbGVuZ3RoICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMykgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlaG9sZGVyW2ZpZWxkXSA9IG1hc2tDaGFyYWN0ZXIucmVwZWF0KGxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtdWx0aXBsZSBwbGFjZWhvbGRlciBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyA9IChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBhbnlbXSA9PiB7XG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydDsgaSA8PSByYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICBpdGVtcy5wdXNoKGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvdyBwbGFjZWhvbGRlcnMgZm9yIGEgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBzaG93UGxhY2Vob2xkZXJzID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbXMocmFuZ2UpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgYXJyYXlcbiAgICAgIGlmIChjb21wb25lbnQuaXRlbXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHJhbmdlLnN0YXJ0ICsgaTtcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBwbGFjZWhvbGRlcnNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBg8J+UhCBbUExBQ0VIT0xERVJTXSBTaG93aW5nICR7cGxhY2Vob2xkZXJzLmxlbmd0aH0gcGxhY2Vob2xkZXJzIGZvciByYW5nZSAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cGxhY2Vob2xkZXJzLXNob3duXCIsIHtcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGNvdW50OiBwbGFjZWhvbGRlcnMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IGlzUGxhY2Vob2xkZXIgPSAoaXRlbTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpdGVtICYmXG4gICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGl0ZW1bVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLlBMQUNFSE9MREVSX0ZMQUddID09PSB0cnVlXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IHJlcGxhY2VQbGFjZWhvbGRlcnMgPSAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFjb21wb25lbnQuaXRlbXMpIHJldHVybjtcblxuICAgICAgbGV0IHJlcGxhY2VkQ291bnQgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnQuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGN1cnJlbnRJdGVtKSkge1xuICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICByZXBsYWNlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcGxhY2VkQ291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGDinKggW1BMQUNFSE9MREVSU10gUmVwbGFjZWQgJHtyZXBsYWNlZENvdW50fSBwbGFjZWhvbGRlcnMgYXQgb2Zmc2V0ICR7b2Zmc2V0fWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtcmVwbGFjZWRcIiwge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBjb3VudDogcmVwbGFjZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwbGFjZWhvbGRlciBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gbnVsbDtcbiAgICAgIGhhc0FuYWx5emVkID0gZmFsc2U7XG4gICAgICBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgZGF0YSBsb2FkIHRvIGFuYWx5emUgc3RydWN0dXJlXG4gICAgICBpZiAoYW5hbHl6ZUZpcnN0TG9hZCkge1xuICAgICAgICBjb25zdCBoYW5kbGVSYW5nZUxvYWRlZCA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWhhc0FuYWx5emVkICYmIGRhdGEuaXRlbXMgJiYgZGF0YS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXBsYWNlIGFueSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIGRhdGFcbiAgICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzKGRhdGEuaXRlbXMsIGRhdGEub2Zmc2V0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBoYW5kbGVSYW5nZUxvYWRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgaW5pdGlhbCBwbGFjZWhvbGRlcnMgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC5jb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zKCkgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICBjb25zdCBpbml0aWFsUmFuZ2UgPSB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBNYXRoLm1pbihcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkUgLSAxLFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgICBzaG93UGxhY2Vob2xkZXJzKGluaXRpYWxSYW5nZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb25cbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZnVuY3Rpb25zIGZvciB2aWV3cG9ydCB0byBjYWxsXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLl9wbGFjZWhvbGRlcnNJbml0aWFsaXplID0gaW5pdGlhbGl6ZTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0Rlc3Ryb3kgPSBkZXN0cm95O1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBwbGFjZWhvbGRlcnM6IHtcbiAgICAgICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUsXG4gICAgICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBoYXNBbmFseXplZCxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0sXG4gICAgICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyxcbiAgICAgICAgc2hvd1BsYWNlaG9sZGVycyxcbiAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgcmVwbGFjZVBsYWNlaG9sZGVycyxcbiAgICAgICAgY2xlYXIsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8qKlxuICogUmVuZGVyaW5nIEZlYXR1cmUgLSBJdGVtIHJlbmRlcmluZyBhbmQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIERPTSBlbGVtZW50IGNyZWF0aW9uLCBwb3NpdGlvbmluZywgcmVjeWNsaW5nLCBhbmQgdXBkYXRlc1xuICovXG5cbmltcG9ydCB7IGFkZENsYXNzLCByZW1vdmVDbGFzcywgaGFzQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBpc1BsYWNlaG9sZGVyLFxuICBnZXRWaWV3cG9ydFN0YXRlLFxuICB3cmFwSW5pdGlhbGl6ZSxcbiAgd3JhcERlc3Ryb3ksXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tIFwiLi4vLi4vbGF5b3V0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyaW5nQ29uZmlnIHtcbiAgdGVtcGxhdGU/OiAoXG4gICAgaXRlbTogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICkgPT4gc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBtZWFzdXJlSXRlbXM/OiBib29sZWFuO1xuICBlbmFibGVSZWN5Y2xpbmc/OiBib29sZWFuO1xuICBtYXhQb29sU2l6ZT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhSZW5kZXJpbmcgPSAoY29uZmlnOiBSZW5kZXJpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBvdmVyc2NhbiA9IDUsXG4gICAgICBtZWFzdXJlSXRlbXMgPSBmYWxzZSxcbiAgICAgIGVuYWJsZVJlY3ljbGluZyA9IHRydWUsXG4gICAgICBtYXhQb29sU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRU5ERVJJTkcuREVGQVVMVF9NQVhfUE9PTF9TSVpFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgY29uc3QgY29sbGVjdGlvbkl0ZW1zOiBSZWNvcmQ8bnVtYmVyLCBhbnk+ID0ge307XG4gICAgY29uc3QgZWxlbWVudFBvb2w6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCBwb29sU3RhdHMgPSB7IGNyZWF0ZWQ6IDAsIHJlY3ljbGVkOiAwLCBwb29sU2l6ZTogMCwgcmVsZWFzZWQ6IDAgfTtcblxuICAgIC8vIFN0b3JlIGxheW91dCByZXN1bHRzIGZvciBwcm9wZXIgY2xlYW51cCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgY29uc3QgbGF5b3V0UmVzdWx0cyA9IG5ldyBXZWFrTWFwPEhUTUxFbGVtZW50LCB7IGRlc3Ryb3k6ICgpID0+IHZvaWQgfT4oKTtcblxuICAgIC8vIFJldXNhYmxlIHRlbXBsYXRlIGVsZW1lbnQgZm9yIEhUTUwgc3RyaW5nIHBhcnNpbmcgKG1vcmUgZWZmaWNpZW50IHRoYW4gZGl2KVxuICAgIGNvbnN0IHRlbXBsYXRlUGFyc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IFZpZXdwb3J0U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgIGxldCBsYXN0UmVuZGVyVGltZSA9IDA7XG4gICAgbGV0IGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG5cbiAgICAvLyBFbGVtZW50IHBvb2wgbWFuYWdlbWVudFxuICAgIGNvbnN0IGdldFBvb2xlZEVsZW1lbnQgPSAoKTogSFRNTEVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVuYWJsZVJlY3ljbGluZyAmJiBlbGVtZW50UG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCsrO1xuICAgICAgICByZXR1cm4gZWxlbWVudFBvb2wucG9wKCkhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBwb29sU3RhdHMuY3JlYXRlZCsrO1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbGVhc2VFbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICBwb29sU3RhdHMucmVsZWFzZWQrKztcblxuICAgICAgLy8gQ1JJVElDQUw6IENhbGwgZGVzdHJveSBvbiBsYXlvdXRSZXN1bHQgdG8gY2xlYW4gdXAgY29tcG9uZW50cyBhbmQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAvLyBUaGlzIGZpeGVzIHRoZSBtZW1vcnkgbGVhayB3aGVuIHVzaW5nIGxheW91dCB0ZW1wbGF0ZXNcbiAgICAgIGNvbnN0IGxheW91dFJlc3VsdCA9IGxheW91dFJlc3VsdHMuZ2V0KGVsZW1lbnQpO1xuICAgICAgaWYgKGxheW91dFJlc3VsdCAmJiB0eXBlb2YgbGF5b3V0UmVzdWx0LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxheW91dFJlc3VsdC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZGVzdHJveSBlcnJvcnMgLSBlbGVtZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXRSZXN1bHRzLmRlbGV0ZShlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbmFibGVSZWN5Y2xpbmcpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gZWxlbWVudCBmb3IgcmV1c2UgKG5vIGNsb25pbmcgLSByZXVzZSB0aGUgYWN0dWFsIGVsZW1lbnQpXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaW5kZXhcIik7XG4gICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICAvLyBSZW1vdmUgZnJvbSBET00gZmlyc3RcbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG8gcG9vbCBpZiBub3QgZnVsbFxuICAgICAgaWYgKGVsZW1lbnRQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7XG4gICAgICAgIGVsZW1lbnRQb29sLnB1c2goZWxlbWVudCk7XG4gICAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IGVsZW1lbnRQb29sLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIElmIHBvb2wgaXMgZnVsbCwgZWxlbWVudCBpcyBqdXN0IGRlcmVmZXJlbmNlZCBhbmQgR0MnZFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpIGFzIFZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgZnJvbSBjdXJyZW50IHZpcnR1YWwgc2l6ZVxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyICYmIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gdXBkYXRlIHJlcXVlc3RzIGZyb20gQVBJXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCBpdGVtLCBwcmV2aW91c0l0ZW0gfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBpdGVtIGluIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHJlbmRlcmVkXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgY29uc3Qgd2FzVmlzaWJsZSA9ICEhZXhpc3RpbmdFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB1cGRhdGVcbiAgICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSBleGlzdGluZ0VsZW1lbnRcbiAgICAgICAgICA/IGhhc0NsYXNzKFxuICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQsXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MsXG4gICAgICAgICAgICApIHx8IGhhc0NsYXNzKGV4aXN0aW5nRWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIpXG4gICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBpdGVtXG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIENvcHkgcG9zaXRpb24gc3R5bGVzIGZyb20gZXhpc3RpbmcgZWxlbWVudFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUucG9zaXRpb24sXG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogZXhpc3RpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgd2lkdGg6IGV4aXN0aW5nRWxlbWVudC5zdHlsZS53aWR0aCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBzZWxlY3RlZCBzdGF0ZVxuICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MpO1xuICAgICAgICAgICAgICBhZGRDbGFzcyhuZXdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB1cGRhdGUgYW5pbWF0aW9uIGNsYXNzIHRvIGlubmVyIGNvbnRlbnQgZm9yIHZpc2liaWxpdHlcbiAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIC8vIEFsc28gdHJ5IHRvIGFkZCB0byBmaXJzdCBjaGlsZCBpZiBpdCBleGlzdHMgKHRoZSBhY3R1YWwgaXRlbSBjb250ZW50KVxuICAgICAgICAgICAgY29uc3QgaW5uZXJJdGVtID0gbmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgaW4gRE9NXG4gICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpbmRleCwgbmV3RWxlbWVudCk7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFuaW1hdGlvbiBjbGFzcyBhZnRlciB0cmFuc2l0aW9uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgICBpZiAoaW5uZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZWRcIiwge1xuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICAgIHdhc1Zpc2libGUsXG4gICAgICAgICAgd2FzU2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSByZW1vdmUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0gfSA9IGRhdGE7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gdHJ1ZTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdID09PT09PT09PT0gSVRFTSBSRU1PVkUgU1RBUlQgKHY0KSA9PT09PT09PT09YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtSRU5ERVItRklYXSBSZW1vdmluZyBpbmRleDogJHtpbmRleH1gKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBvZiB0cnV0aCAtIGNvbGxlY3Rpb24uaXRlbXMgaGFzIGFscmVhZHkgYmVlbiBzcGxpY2VkIGJ5IGFwaS50c1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbXNTb3VyY2UgPVxuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fFxuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5pdGVtcyB8fFxuICAgICAgICAgIFtdO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zU291cmNlLmxlbmd0aDogJHtjb2xsZWN0aW9uSXRlbXNTb3VyY2UubGVuZ3RofWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zIGNhY2hlIHNpemUgQkVGT1JFOiAke09iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcykubGVuZ3RofWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gU3RyYXRlZ3k6IFNoaWZ0IGNvbGxlY3Rpb25JdGVtcyBjYWNoZSBpbmRpY2VzIGRvd24sIGJ1dCB1c2UgYWN0dWFsIGRhdGFcbiAgICAgICAgLy8gZnJvbSBjb2xsZWN0aW9uLml0ZW1zICh3aGljaCBoYXMgYmVlbiBzcGxpY2VkKSBmb3IgdGhlIGxvYWRlZCByYW5nZS5cbiAgICAgICAgLy8gRm9yIGluZGljZXMgYmV5b25kIHRoZSBsb2FkZWQgcmFuZ2UsIHNoaWZ0IHRoZSBjYWNoZWQgZGF0YS5cblxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKVxuICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgIC5maWx0ZXIoKGspID0+ICFpc05hTihrKSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuXG4gICAgICAgIC8vIERlbGV0ZSB0aGUgcmVtb3ZlZCBpbmRleFxuICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBTaGlmdCBhbGwgaW5kaWNlcyBhZnRlciB0aGUgcmVtb3ZlZCBvbmUgZG93biBieSAxXG4gICAgICAgIC8vIEZvciBpbmRpY2VzIHdpdGhpbiB0aGUgbG9hZGVkIHJhbmdlLCB1c2UgZGF0YSBmcm9tIGNvbGxlY3Rpb24uaXRlbXNcbiAgICAgICAgLy8gRm9yIGluZGljZXMgYmV5b25kLCBzaGlmdCB0aGUgZXhpc3RpbmcgY2FjaGVkIGRhdGFcbiAgICAgICAgY29uc3QgbG9hZGVkTGVuZ3RoID0gY29sbGVjdGlvbkl0ZW1zU291cmNlLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGtleSAtIDE7XG4gICAgICAgICAgICAvLyBJZiBuZXdJbmRleCBpcyB3aXRoaW4gbG9hZGVkIGRhdGEsIHVzZSBzb3VyY2U7IG90aGVyd2lzZSBzaGlmdCBjYWNoZVxuICAgICAgICAgICAgaWYgKG5ld0luZGV4IDwgbG9hZGVkTGVuZ3RoICYmIGNvbGxlY3Rpb25JdGVtc1NvdXJjZVtuZXdJbmRleF0pIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW25ld0luZGV4XSA9IGNvbGxlY3Rpb25JdGVtc1NvdXJjZVtuZXdJbmRleF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBTaGlmdCBjYWNoZWQgZGF0YSBmb3IgaW5kaWNlcyBiZXlvbmQgbG9hZGVkIHJhbmdlXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tuZXdJbmRleF0gPSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbEtleXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpXG4gICAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gIWlzTmFOKGspKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zIGNhY2hlIHNpemUgQUZURVI6ICR7ZmluYWxLZXlzLmxlbmd0aH1gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIGNvbGxlY3Rpb25JdGVtcyBrZXlzOiBbJHtmaW5hbEtleXMuc2xpY2UoMCwgMTApLmpvaW4oXCIsIFwiKX0ke2ZpbmFsS2V5cy5sZW5ndGggPiAxMCA/IFwiLi4uXCIgOiBcIlwifV1gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtczogJHt2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zfWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2U6ICR7SlNPTi5zdHJpbmdpZnkodmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlKX1gLFxuICAgICAgICAvLyApO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBhbnkgdW5kZWZpbmVkL251bGwgdmFsdWVzIGluIGZpcnN0IDMwIGl0ZW1zXG4gICAgICAgIGNvbnN0IGJhZEluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oMzAsIGZpbmFsS2V5cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrID0gZmluYWxLZXlzW2ldO1xuICAgICAgICAgIGlmICghY29sbGVjdGlvbkl0ZW1zW2tdIHx8IGNvbGxlY3Rpb25JdGVtc1trXS5fcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIGJhZEluZGljZXMucHVzaChrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlbmRlcmVkIGVsZW1lbnQgYXQgdGhpcyBpbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcblxuICAgICAgICAvLyBTaGlmdCByZW5kZXJlZCBlbGVtZW50cyBpbmRpY2VzIGRvd25cbiAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgIGlmIChrZXkgPiBpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgZGF0YS1pbmRleCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKGtleSAtIDEpO1xuICAgICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChrZXkgLSAxLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSA8IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbGVtZW50XSBvZiBuZXdSZW5kZXJlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY3JlbWVudCB0b3RhbEl0ZW1zIE5PVyBzbyByZW5kZXJJdGVtcygpIHVzZXMgdGhlIGNvcnJlY3QgY291bnRcbiAgICAgICAgLy8gc2V0VG90YWxJdGVtcygpIHdpbGwgYmUgY2FsbGVkIGxhdGVyIGJ5IHRoZSBBUEksIHdoaWNoIHdpbGwgZW1pdFxuICAgICAgICAvLyB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIGZvciB2aXJ0dWFsIHNpemUgcmVjYWxjdWxhdGlvblxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSAmJiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRvIGZvcmNlIHJlLXJlbmRlclxuICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06cmVtb3ZlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWZ0ZXIgaXRlbSByZW1vdmFsLCBjbGVhciBBTEwgbG9hZGVkUmFuZ2VzIGFuZCBjb2xsZWN0aW9uSXRlbXMgY2FjaGVcbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBjb21wbGV0ZSByZWxvYWQgd2hpY2ggaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0b1xuICAgICAgICAvLyB0cmFjayBzaGlmdGVkIGluZGljZXMuIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGFuZCBhbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHdoYXQgbG9hZGVkUmFuZ2VzIHRoaW5rcyB0aGV5IGFyZS5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aGUgZW50aXJlIGNvbGxlY3Rpb25JdGVtcyBjYWNoZSAtIGl0J3MgYWxsIHN0YWxlIGFmdGVyIHJlbW92YWxcbiAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBpdGVtcyB3ZSBhY3R1YWxseSBoYXZlIGluIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGNvbGxlY3Rpb25JdGVtc1NvdXJjZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5cyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcylcbiAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiAhaXNOYU4oaykpO1xuICAgICAgICBjYWNoZUtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA+PSBsb2FkZWRJdGVtc0NvdW50KSB7XG4gICAgICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbG9hZCBvZiB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcbiAgICAgICAgaWYgKHZpc2libGVSYW5nZSAmJiBjb2xsZWN0aW9uPy5sb2FkTWlzc2luZ1Jhbmdlcykge1xuICAgICAgICAgIGNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgICB7IHN0YXJ0OiAwLCBlbmQ6IE1hdGgubWF4KHZpc2libGVSYW5nZS5lbmQsIGxvYWRlZEl0ZW1zQ291bnQpIH0sXG4gICAgICAgICAgICBcIml0ZW0tcmVtb3ZhbFwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlLXJlbmRlclxuICAgICAgICByZW5kZXJJdGVtcygpO1xuICAgICAgICBpc1JlbW92aW5nSXRlbSA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgb3VyIGNhY2hlIHRvb1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOml0ZW1zLWV2aWN0ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtlZXBTdGFydCwga2VlcEVuZCwgZXZpY3RlZENvdW50IH0gPSBkYXRhO1xuICAgICAgICBsZXQgY2xlYW5lZENvdW50ID0gMDtcblxuICAgICAgICAvLyBSZW1vdmUgZXZpY3RlZCBpdGVtcyBmcm9tIG91ciBjYWNoZVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb2xsZWN0aW9uSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGtleSwgMTApO1xuICAgICAgICAgIGlmIChpbmRleCA8IGtlZXBTdGFydCB8fCBpbmRleCA+IGtlZXBFbmQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgY2xlYW5lZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGRhdGEgbG9hZGVkXG4gICAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZCAtIG9mZnNldDogJHtkYXRhLm9mZnNldH0sIGl0ZW1zOiAke2RhdGEuaXRlbXM/Lmxlbmd0aH1gLFxuICAgICAgICAvLyApO1xuICAgICAgICBpZiAoIWRhdGEuaXRlbXM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuYWx5emUgZGF0YSBzdHJ1Y3R1cmUgb24gZmlyc3QgbG9hZFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSAoY29tcG9uZW50IGFzIGFueSkucGxhY2Vob2xkZXJzO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXJzICYmICFwbGFjZWhvbGRlcnMuaGFzQW5hbHl6ZWRTdHJ1Y3R1cmUoKSkge1xuICAgICAgICAgIHBsYWNlaG9sZGVycy5hbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBjb2xsZWN0aW9uIGl0ZW1zIGFuZCByZXBsYWNlIHBsYWNlaG9sZGVyc1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIFVwZGF0aW5nIGNvbGxlY3Rpb25JdGVtcyBmb3IgaW5kaWNlcyAke2RhdGEub2Zmc2V0fSB0byAke2RhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxfWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIGxldCByZXBsYWNlZENvdW50ID0gMDtcbiAgICAgICAgbGV0IHNraXBwZWRDb3VudCA9IDA7XG4gICAgICAgIGRhdGEuaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGRhdGEub2Zmc2V0ICsgaTtcbiAgICAgICAgICBjb25zdCBvbGRJdGVtID0gY29sbGVjdGlvbkl0ZW1zW2luZGV4XTtcbiAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICAgICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXIgaW4gRE9NIGlmIG5lZWRlZFxuICAgICAgICAgIGNvbnN0IHdhc1BsYWNlaG9sZGVyID0gb2xkSXRlbSAmJiBpc1BsYWNlaG9sZGVyKG9sZEl0ZW0pO1xuICAgICAgICAgIGNvbnN0IGhhc0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmhhcyhpbmRleCk7XG4gICAgICAgICAgaWYgKHdhc1BsYWNlaG9sZGVyICYmIGhhc0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzZXMgZnJvbSB3cmFwcGVyXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgICAvLyBBbHNvIHJlbW92ZSBmcm9tIGlubmVyIGVsZW1lbnQgKGZvciBzdHJpbmcgdGVtcGxhdGVzKVxuICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgcmVwbGFjZWQgY2xhc3MgZm9yIGZhZGUtaW4gYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAgIC8vIENvcHkgcG9zaXRpb24gYW5kIHJlcGxhY2VcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZT8ucmVwbGFjZUNoaWxkKG5ld0VsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmVwbGFjZWQgY2xhc3MgYWZ0ZXIgYW5pbWF0aW9uIGNvbXBsZXRlc1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNQbGFjZWhvbGRlciAmJiAhaGFzRWxlbWVudCkge1xuICAgICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgKHJlcGxhY2VkQ291bnQgPiAwIHx8IHNraXBwZWRDb3VudCA+IDApIHtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gUGxhY2Vob2xkZXIgcmVwbGFjZW1lbnQ6ICR7cmVwbGFjZWRDb3VudH0gcmVwbGFjZWQsICR7c2tpcHBlZENvdW50fSBza2lwcGVkIChub3QgcmVuZGVyZWQpYCxcbiAgICAgICAgLy8gICApO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byByZW5kZXJcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlUmFuZ2UgfSA9IHZpZXdwb3J0U3RhdGUgfHwge307XG4gICAgICAgIGlmICh2aXNpYmxlUmFuZ2UpIHtcbiAgICAgICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgPz8gMCAtIDEsXG4gICAgICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRTdGFydCA9IGRhdGEub2Zmc2V0O1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEVuZCA9IGRhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIHBsYWNlaG9sZGVycyBpbiByYW5nZVxuICAgICAgICAgIGNvbnN0IGhhc1BsYWNlaG9sZGVyc0luUmFuZ2UgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgeyBsZW5ndGg6IE1hdGgubWluKGxvYWRlZEVuZCwgcmVuZGVyRW5kKSAtIGxvYWRlZFN0YXJ0ICsgMSB9LFxuICAgICAgICAgICAgKF8sIGkpID0+IGNvbGxlY3Rpb25JdGVtc1tsb2FkZWRTdGFydCArIGldLFxuICAgICAgICAgICkuc29tZSgoaXRlbSkgPT4gaXRlbSAmJiBpc1BsYWNlaG9sZGVyKGl0ZW0pKTtcblxuICAgICAgICAgIGNvbnN0IG5lZWRzUmVuZGVyID1cbiAgICAgICAgICAgIChsb2FkZWRTdGFydCA8PSByZW5kZXJFbmQgJiZcbiAgICAgICAgICAgICAgbG9hZGVkRW5kID49IHJlbmRlclN0YXJ0ICYmXG4gICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMSkgfHxcbiAgICAgICAgICAgIGhhc1BsYWNlaG9sZGVyc0luUmFuZ2U7XG5cbiAgICAgICAgICBpZiAobmVlZHNSZW5kZXIpIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHJlbmRlckl0ZW1zKTtcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgY29udGFpbmVyIGhlaWdodCB3aGVuIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyICYmXG4gICAgICAgICAgZGF0YS50b3RhbFZpcnR1YWxTaXplICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHtkYXRhLnRvdGFsVmlydHVhbFNpemV9cHhgO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFRlbXBsYXRlIGhlbHBlcnNcbiAgICBjb25zdCBnZXREZWZhdWx0VGVtcGxhdGUgPSAoKSA9PiAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBVc2UgbGF5b3V0IHN5c3RlbSBmb3IgZGVmYXVsdCB0ZW1wbGF0ZVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgICBjbGFzczogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gICAgICAgICAgdGV4dDpcbiAgICAgICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgID8gaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IGBJdGVtICR7aW5kZXh9YFxuICAgICAgICAgICAgICA6IFN0cmluZyhpdGVtKSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfTtcblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSB3aXRoIGl0ZW0gZGF0YSBzdWJzdGl0dXRpb25cbiAgICBjb25zdCBwcm9jZXNzTGF5b3V0U2NoZW1hID0gKFxuICAgICAgc2NoZW1hOiBhbnksXG4gICAgICBpdGVtOiBhbnksXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICk6IGFueSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyBIYW5kbGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGxpa2Uge3tuYW1lfX0sIHt7aW5kZXh9fVxuICAgICAgICByZXR1cm4gc2NoZW1hLnJlcGxhY2UoL1xce1xceyhbXn1dKylcXH1cXH0vZywgKG1hdGNoLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImluZGV4XCIpIHJldHVybiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaXRlbVwiKSByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuXG4gICAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBwcm9wZXJ0aWVzIGxpa2Uge3t1c2VyLm5hbWV9fVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0ga2V5LnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG9iajogYW55LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvYmo/Lltwcm9wLnRyaW0oKV07XG4gICAgICAgICAgfSwgaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyh2YWx1ZSkgOiBtYXRjaDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5tYXAoKGNoaWxkKSA9PiBwcm9jZXNzTGF5b3V0U2NoZW1hKGNoaWxkLCBpdGVtLCBpbmRleCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJiBzY2hlbWEgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkOiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgICAgIHByb2Nlc3NlZFtrZXldID0gcHJvY2Vzc0xheW91dFNjaGVtYSh2YWx1ZSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfTtcblxuICAgIC8vIFBvc2l0aW9uIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgY2FsY3VsYXRlSXRlbVBvc2l0aW9uID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgICB0b3RhbEl0ZW1zOiBudW1iZXIsXG4gICAgICBpdGVtU2l6ZTogbnVtYmVyLFxuICAgICAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyLFxuICAgICAgY29udGFpbmVyU2l6ZTogbnVtYmVyLFxuICAgICAgdGFyZ2V0U2Nyb2xsSW5kZXg/OiBudW1iZXIsXG4gICAgKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9XG4gICAgICAgIGFjdHVhbFRvdGFsU2l6ZSA+IHZpcnR1YWxUb3RhbFNpemUgJiYgdmlydHVhbFRvdGFsU2l6ZSA+IDA7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSB0YXJnZXRTY3JvbGxJbmRleCAoZnJvbSBpbml0aWFsU2Nyb2xsSW5kZXgpLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdGVtcyBhcmUgcG9zaXRpb25lZCBjb3JyZWN0bHkgZXZlbiB3aXRoIGNvbXByZXNzaW9uXG4gICAgICBpZiAodGFyZ2V0U2Nyb2xsSW5kZXggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgLy8gUG9zaXRpb24gaXRlbXMgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBpbmRleFxuICAgICAgICAvLyBUaGUgdGFyZ2V0IGluZGV4IHNob3VsZCBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgcmV0dXJuIChpbmRleCAtIHRhcmdldFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzQ29tcHJlc3NlZCB8fCB0b3RhbEl0ZW1zID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpbmRleCAqIGl0ZW1TaXplIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgaGFuZGxpbmdcbiAgICAgIGNvbnN0IG1heFNjcm9sbFBvc2l0aW9uID0gdmlydHVhbFRvdGFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGxQb3NpdGlvbiAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbmVhckJvdHRvbVRocmVzaG9sZCA9IGNvbnRhaW5lclNpemU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tIDw9IG5lYXJCb3R0b21UaHJlc2hvbGQgJiZcbiAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xXG4gICAgICApIHtcbiAgICAgICAgLy8gTmVhciBib3R0b20gaW50ZXJwb2xhdGlvblxuICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBuZWFyQm90dG9tVGhyZXNob2xkKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBib3R0b21Qb3NpdGlvbiA9IChpbmRleCAtIGZpcnN0VmlzaWJsZUF0Qm90dG9tKSAqIGl0ZW1TaXplO1xuICAgICAgICBjb25zdCBub3JtYWxQb3NpdGlvbiA9IChpbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbm9ybWFsUG9zaXRpb24gKyAoYm90dG9tUG9zaXRpb24gLSBub3JtYWxQb3NpdGlvbikgKiBpbnRlcnBvbGF0aW9uXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vcm1hbCBjb21wcmVzc2VkIHNjcm9sbGluZ1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICByZXR1cm4gKGluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgIH07XG5cbiAgICAvLyBSZW5kZXIgc2luZ2xlIGl0ZW1cbiAgICBjb25zdCByZW5kZXJJdGVtID0gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBpdGVtVGVtcGxhdGUgPSB0ZW1wbGF0ZSB8fCBnZXREZWZhdWx0VGVtcGxhdGUoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaXRlbVRlbXBsYXRlKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgbGV0IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHJlc3VsdCBpcyBhIGxheW91dCBzY2hlbWEgKGFycmF5IG9yIG9iamVjdClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVzdWx0KSB8fFxuICAgICAgICAgICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICByZXN1bHQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICEocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBQcm9jZXNzIHNjaGVtYSB0byBzdWJzdGl0dXRlIHZhcmlhYmxlc1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFNjaGVtYSA9IHByb2Nlc3NMYXlvdXRTY2hlbWEocmVzdWx0LCBpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBVc2UgbGF5b3V0IHN5c3RlbSB0byBjcmVhdGUgZWxlbWVudFxuICAgICAgICAgIGNvbnN0IGxheW91dFJlc3VsdCA9IGNyZWF0ZUxheW91dChwcm9jZXNzZWRTY2hlbWEpO1xuICAgICAgICAgIGVsZW1lbnQgPSBsYXlvdXRSZXN1bHQuZWxlbWVudDtcblxuICAgICAgICAgIC8vIElmIHRoZSBsYXlvdXQgY3JlYXRlZCBhIHdyYXBwZXIsIHVzZSBpdCBkaXJlY3RseVxuICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEVsZW1lbnQgaXMgYWxyZWFkeSBjcmVhdGVkIGJ5IGxheW91dCBzeXN0ZW1cbiAgICAgICAgICAgIC8vIFN0b3JlIGxheW91dFJlc3VsdCBmb3IgY2xlYW51cCB3aGVuIGVsZW1lbnQgaXMgcmVsZWFzZWQgKHByZXZlbnRzIG1lbW9yeSBsZWFrKVxuICAgICAgICAgICAgbGF5b3V0UmVzdWx0cy5zZXQoZWxlbWVudCwgbGF5b3V0UmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgaWYgbGF5b3V0IGRpZG4ndCBjcmVhdGUgYSBwcm9wZXIgZWxlbWVudFxuICAgICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmIChsYXlvdXRSZXN1bHQuZWxlbWVudCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGxheW91dFJlc3VsdC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IG9uIHdyYXBwZXIgZWxlbWVudCBmb3IgY2xlYW51cFxuICAgICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgLy8gUGFyc2UgSFRNTCB1c2luZyB0ZW1wbGF0ZSBlbGVtZW50IC0gb3B0aW1pemVkIHBhdGhcbiAgICAgICAgICAvLyBNb3ZlIG5vZGVzIGRpcmVjdGx5IGluc3RlYWQgb2YgY2xvbmluZyAtIG11Y2ggZmFzdGVyLCBubyBtZW1vcnkgb3ZlcmhlYWRcbiAgICAgICAgICB0ZW1wbGF0ZVBhcnNlci5pbm5lckhUTUwgPSByZXN1bHQ7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHRlbXBsYXRlUGFyc2VyLmNvbnRlbnQ7XG5cbiAgICAgICAgICBpZiAoY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZSByb290IGVsZW1lbnQgLSBtb3ZlIGRpcmVjdGx5IChmYXN0ZXIgdGhhbiBjbG9uZU5vZGUpXG4gICAgICAgICAgICBlbGVtZW50ID0gY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbVwiKTtcbiAgICAgICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGl0ZW0pKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE11bHRpcGxlIGNoaWxkcmVuIC0gbW92ZSBhbGwgaW50byBwb29sZWQgZWxlbWVudFxuICAgICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHdoaWxlIChjb250ZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1JlbmRlcmluZ10gSW52YWxpZCB0ZW1wbGF0ZSByZXN1bHQgZm9yIGl0ZW0gJHtpbmRleH1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjbGFzc2VzXG4gICAgICAgIGlmICghaGFzQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpKVxuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwidmlld3BvcnQtaXRlbVwiKTtcbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKGluZGV4KTtcblxuICAgICAgICAvLyBDb3B5IGRhdGEtaWQgZnJvbSBpdGVtIHRvIHZpZXdwb3J0IGVsZW1lbnQgZm9yIHNlbGVjdGlvbiBzdXBwb3J0XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0/Ll9pZCB8fCBpdGVtPy5pZDtcbiAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1JZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pZCA9IFN0cmluZyhpdGVtSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1JlbmRlcmluZ10gRXJyb3IgcmVuZGVyaW5nIGl0ZW0gJHtpbmRleH06YCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHBvc2l0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1Qb3NpdGlvbnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgcmVuZGVyZWRFbGVtZW50cy5zaXplID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGl0ZW1TaXplOiBpdGVtU2l6ZSxcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgY29uc3Qgc29ydGVkSW5kaWNlcyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICk7XG4gICAgICBpZiAoIXNvcnRlZEluZGljZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBzb3J0ZWRJbmRpY2VzWzBdO1xuICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbiA9IDA7XG5cbiAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdmlydHVhbFRvdGFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdFNjcm9sbEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gY29udGFpbmVyU2l6ZSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJvdHRvbVBvcyA9IChmaXJzdEluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsUG9zID0gKGZpcnN0SW5kZXggLSBleGFjdFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IG5vcm1hbFBvcyArIChib3R0b21Qb3MgLSBub3JtYWxQb3MpICogaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAoZmlyc3RJbmRleCAtIHNjcm9sbFJhdGlvICogdG90YWxJdGVtcykgKiBpdGVtU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFBvc2l0aW9uID0gZmlyc3RJbmRleCAqIGl0ZW1TaXplIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFBvc2l0aW9uIGVhY2ggaXRlbVxuICAgICAgc29ydGVkSW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtNYXRoLnJvdW5kKFxuICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uLFxuICAgICAgICAgICl9cHgpYDtcblxuICAgICAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGxhc3QgaXRlbXNcbiAgICAgICAgICAvLyBpZiAoaW5kZXggPj0gdG90YWxJdGVtcyAtIDUpIHtcbiAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgICBgW1JlbmRlcmluZ10gTGFzdCBpdGVtIHBvc2l0aW9uZWQ6IGluZGV4PSR7aW5kZXh9LCBwb3NpdGlvbj0ke01hdGgucm91bmQoXG4gICAgICAgICAgLy8gICAgICAgY3VycmVudFBvc2l0aW9uXG4gICAgICAgICAgLy8gICAgICl9cHgsIGl0ZW1TaXplPSR7aXRlbVNpemV9cHgsIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfWBcbiAgICAgICAgICAvLyAgICk7XG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gTWFpbiByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCByZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHZpc2libGVSYW5nZSxcbiAgICAgICAgaXRlbXNDb250YWluZXIsXG4gICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgIGl0ZW1TaXplLFxuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgIH0gPSB2aWV3cG9ydFN0YXRlO1xuXG4gICAgICAvLyBWYWxpZGF0ZSByYW5nZSAtIHNraXAgcmVuZGVyaW5nIGlmIG5vIGl0ZW1zIG9yIHJhbmdlIGlzIGludmFsaWRcbiAgICAgIGlmIChcbiAgICAgICAgIXZpc2libGVSYW5nZSB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDAgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0IDwgMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPj0gdG90YWxJdGVtcyB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kIDwgdmlzaWJsZVJhbmdlLnN0YXJ0IHx8XG4gICAgICAgIGlzTmFOKHZpc2libGVSYW5nZS5zdGFydCkgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLmVuZClcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB0b3RhbEl0ZW1zIGlzIDAsIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50cyB0byByZW1vdmUgc3RhbGUgcGxhY2Vob2xkZXJzXG4gICAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDAgJiYgcmVuZGVyZWRFbGVtZW50cy5zaXplID4gMCkge1xuICAgICAgICAgIEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5lbnRyaWVzKCkpLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgcmFuZ2UgY2hhbmdlZFxuICAgICAgaWYgKFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPT09IGN1cnJlbnRWaXNpYmxlUmFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5lbmQgJiZcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zaXplID4gMFxuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsYXN0UmVuZGVyVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgIGNvbnN0IHJlbmRlckVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4pO1xuXG4gICAgICAvLyBpZiAoaXNSZW1vdmluZ0l0ZW0pIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiB2aXNpYmxlUmFuZ2U9JHtKU09OLnN0cmluZ2lmeSh2aXNpYmxlUmFuZ2UpfSwgb3ZlcnNjYW49JHtvdmVyc2Nhbn0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gcmVuZGVySXRlbXMgY2FsYzogcmVuZGVyU3RhcnQ9JHtyZW5kZXJTdGFydH0sIHJlbmRlckVuZD0ke3JlbmRlckVuZH1gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZW1vdmUgaXRlbXMgb3V0c2lkZSByYW5nZVxuICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSlcbiAgICAgICAgLmZpbHRlcigoW2luZGV4XSkgPT4gaW5kZXggPCByZW5kZXJTdGFydCB8fCBpbmRleCA+IHJlbmRlckVuZClcbiAgICAgICAgLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaXRlbXMgc291cmNlXG4gICAgICBjb25zdCBoYXNDb2xsZWN0aW9uSXRlbXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpLmxlbmd0aCA+IDA7XG4gICAgICBjb25zdCBpdGVtcyA9IGhhc0NvbGxlY3Rpb25JdGVtc1xuICAgICAgICA/IGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICA6IGNvbXBvbmVudC5pdGVtcyB8fCBbXTtcbiAgICAgIGNvbnN0IG1pc3NpbmdJdGVtczogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gUmVuZGVyIGl0ZW1zIGluIHJhbmdlXG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyU3RhcnQ7IGkgPD0gcmVuZGVyRW5kOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxJdGVtcyB8fCByZW5kZXJlZEVsZW1lbnRzLmhhcyhpKSkgY29udGludWU7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgLy8gT25seSBsb2cgZHVyaW5nIHJlbW92YWwgdG8gYXZvaWQgc3BhbSBkdXJpbmcgc2Nyb2xsXG5cbiAgICAgICAgICBtaXNzaW5nSXRlbXMucHVzaChpKTtcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBwbGFjZWhvbGRlclxuICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgICAgaXRlbSA9IHBsYWNlaG9sZGVycz8uZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkgfHwge1xuICAgICAgICAgICAgX3BsYWNlaG9sZGVyOiB0cnVlLFxuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBpZDogYHBsYWNlaG9sZGVyLSR7aX1gLFxuICAgICAgICAgICAgbmFtZTogVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCgxNSksXG4gICAgICAgICAgICB0ZXh0OiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDI1KSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDQwKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tpXSA9IGl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBHZXQgdGFyZ2V0U2Nyb2xsSW5kZXggZnJvbSB2aWV3cG9ydFN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KT8udGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjYWxjdWxhdGVJdGVtUG9zaXRpb24oXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgICAgaXRlbVNpemUsXG4gICAgICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7cG9zaXRpb259cHgpYCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVlc3QgbWlzc2luZyBpdGVtc1xuICAgICAgaWYgKFxuICAgICAgICBtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbmRlcmluZzptaXNzaW5nLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB2aXNpYmxlUmFuZ2U7XG5cbiAgICAgIC8vIExvZyBET00gc3RhdHMgcGVyaW9kaWNhbGx5IChldmVyeSAxMCByZW5kZXJzKVxuICAgICAgaWYgKHBvb2xTdGF0cy5jcmVhdGVkICUgNTAgPT09IDAgJiYgcG9vbFN0YXRzLmNyZWF0ZWQgPiAwKSB7XG4gICAgICAgIGxvZ0RPTVN0YXRzKGByZW5kZXI6JHtwb29sU3RhdHMuY3JlYXRlZH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBpdGVtcyByZW5kZXJlZCBldmVudCB3aXRoIGVsZW1lbnRzIGZvciBzaXplIGNhbGN1bGF0aW9uXG4gICAgICBjb25zdCByZW5kZXJlZEVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMudmFsdWVzKCkpO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIHtcbiAgICAgICAgZWxlbWVudHM6IHJlbmRlcmVkRWxlbWVudHNBcnJheSxcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwge1xuICAgICAgICByYW5nZTogdmlzaWJsZVJhbmdlLFxuICAgICAgICByZW5kZXJlZENvdW50OiByZW5kZXJlZEVsZW1lbnRzLnNpemUsXG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMoKTtcblxuICAgICAgLy8gTG9hZCBkYXRhIGlmIG5vIGl0ZW1zIHJlbmRlcmVkXG4gICAgICBpZiAoXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA9PT0gMCAmJlxuICAgICAgICB0b3RhbEl0ZW1zID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb25cbiAgICAgICkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICB2aXNpYmxlUmFuZ2UsXG4gICAgICAgICAgXCJyZW5kZXJpbmc6bm8taXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVySXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXM7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgcmVuZGVySXRlbXMoKTtcbiAgICAgIG9yaWdpbmFsUmVuZGVySXRlbXM/LigpO1xuICAgIH07XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgd3JhcERlc3Ryb3koY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICAvLyBSZWxlYXNlIGFsbCByZW5kZXJlZCBlbGVtZW50cyAtIHVzZSByZWxlYXNlRWxlbWVudCB0byBwcm9wZXJseSBkZXN0cm95IGxheW91dFJlc3VsdHNcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuXG4gICAgICAvLyBDbGVhciBlbGVtZW50IHBvb2xcbiAgICAgIGVsZW1lbnRQb29sLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIENsZWFyIGNvbGxlY3Rpb24gaXRlbXMgY2FjaGUgLSB0aGlzIGlzIGNyaXRpY2FsIGZvciBtZW1vcnkhXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb2xsZWN0aW9uSXRlbXMpIHtcbiAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVkxpc3QgY29tcG9uZW50IHVzaW5nIGRpcmVjdCB2aWV3cG9ydCBpbnRlZ3JhdGlvblxuICpcbiAqIEBwYXJhbSB7Vkxpc3RDb25maWd9IGNvbmZpZyAtIExpc3QgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Vkxpc3RDb21wb25lbnR9IEEgZnVsbHkgY29uZmlndXJlZCB2aXJ0dWFsIGxpc3QgY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHZsaXN0ID0gY3JlYXRlVkxpc3Qoe1xuICogICBjb250YWluZXI6ICcjbXktbGlzdCcsXG4gKiAgIGNvbGxlY3Rpb246IG15QWRhcHRlcixcbiAqICAgcmFuZ2VTaXplOiAyMCxcbiAqICAgcGFnaW5hdGlvblN0cmF0ZWd5OiAncGFnZScsXG4gKiAgIHRlbXBsYXRlOiAoaXRlbSwgaW5kZXgpID0+IFtcbiAqICAgICB7IGNsYXNzOiAndmlld3BvcnQtaXRlbScsIGF0dHJpYnV0ZXM6IHsgJ2RhdGEtaWQnOiBpdGVtLmlkIH19LFxuICogICAgIFt7IGNsYXNzOiAndmlld3BvcnQtaXRlbV9fbmFtZScsIHRleHQ6IGl0ZW0ubmFtZSB9XSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX3ZhbHVlJywgdGV4dDogaXRlbS52YWx1ZSB9XVxuICogICBdXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVkxpc3QgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4gPSB7fSxcbik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBjb25zb2xlLmxvZyhg8J+TiyBDcmVhdGluZyBWTGlzdCBjb21wb25lbnQgd2l0aCBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25gKTtcblxuICAgIC8vIE5vdGU6IFRyYW5zZm9ybSBzaG91bGQgYmUgYXBwbGllZCBieSB0aGUgY29sbGVjdGlvbiBmZWF0dXJlIGluIHZpZXdwb3J0XG4gICAgLy8gVkxpc3Qgc2hvdWxkIG5vdCBpbnRlcmNlcHQgY29sbGVjdGlvbiByZWFkcyBhcyBpdCBieXBhc3NlcyB0aGUgbG9hZGluZyBtYW5hZ2VyXG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCB0aHJvdWdoIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAgICBjb25zdCBlbmhhbmNlcnMgPSBbXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyXG4gICAgICBjcmVhdGVCYXNlLFxuICAgICAgd2l0aEV2ZW50cygpLFxuICAgICAgd2l0aEVsZW1lbnQoe1xuICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgIGNsYXNzTmFtZTogY29uZmlnLmNsYXNzTmFtZSB8fCBcIm10cmwtdmxpc3RcIixcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIHJvbGU6IFwibGlzdFwiLFxuICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBjb25maWcuYXJpYUxhYmVsIHx8IFwiVmlydHVhbCBMaXN0XCIsXG4gICAgICAgIH0sXG4gICAgICB9KSxcblxuICAgICAgLy8gMi4gVmlld3BvcnQgaW50ZWdyYXRpb25cbiAgICAgIC8vIFBhc3MgYXV0b1NlbGVjdEZpcnN0IGZyb20gc2VsZWN0aW9uIGNvbmZpZyB0byB2aWV3cG9ydCBsZXZlbFxuICAgICAgd2l0aFZpZXdwb3J0KHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICBhdXRvU2VsZWN0Rmlyc3Q6IGNvbmZpZy5zZWxlY3Rpb24/LmF1dG9TZWxlY3RGaXJzdCxcbiAgICAgIH0pLFxuXG4gICAgICAvLyAzLiBDb21wb25lbnQgbGlmZWN5Y2xlXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG5cbiAgICAgIC8vIDQuIFB1YmxpYyBBUEkgbGF5ZXJcbiAgICAgIHdpdGhBUEkoY29uZmlnKSxcbiAgICBdO1xuXG4gICAgLy8gNC41LiBTZWxlY3Rpb24gY2FwYWJpbGl0aWVzIChpZiBlbmFibGVkKSAtIG11c3QgYmUgYWZ0ZXIgQVBJXG4gICAgaWYgKGNvbmZpZy5zZWxlY3Rpb24/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhTZWxlY3Rpb24oY29uZmlnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50ID0gcGlwZSguLi5lbmhhbmNlcnMpKHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbXBvbmVudE5hbWU6IFwidmxpc3RcIixcbiAgICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIixcbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgVkxpc3RDb21wb25lbnQ8VD47XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIuKdjCBbVkxJU1RdIEZhaWxlZCB0byBjcmVhdGUgVkxpc3QgY29tcG9uZW50OlwiLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzXG5cbi8qKlxuICogVmlld3BvcnQgZmVhdHVyZSBmb3IgVkxpc3RcbiAqIEludGVncmF0ZXMgdGhlIGNvcmUgdmlld3BvcnQgZnVuY3Rpb25hbGl0eSB3aXRoIFZMaXN0IGNvbXBvbmVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0SXRlbSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlVmlld3BvcnQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS92aWV3cG9ydFwiO1xuXG4vKipcbiAqIEFkZHMgdmlld3BvcnQgZnVuY3Rpb25hbGl0eSB0byBWTGlzdFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpZXdwb3J0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBhbnkpID0+IHtcbiAgICAvLyBTZXQgaW5pdGlhbCBpdGVtcyBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcuaXRlbXMpIHtcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGNvbmZpZy5pdGVtcztcbiAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gY29uZmlnLml0ZW1zLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGVtcGxhdGUgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLnRlbXBsYXRlKSB7XG4gICAgICBjb21wb25lbnQudGVtcGxhdGUgPSBjb25maWcudGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoZSBlbGVtZW50IGhhcyBib3RoIHZsaXN0IGFuZCB2aWV3cG9ydCBjbGFzc2VzXG4gICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjbGFzc05hbWU6IFwibXRybC12aWV3cG9ydFwiLCAvLyBUaGlzIHdpbGwgYmUgYWRkZWQgYnkgdmlld3BvcnQgYmFzZSBmZWF0dXJlXG4gICAgfTtcblxuICAgIC8vIFBhc3MgVkxpc3QgY29uZmlnIGRpcmVjdGx5IHRvIHZpZXdwb3J0XG4gICAgY29uc3Qgdmlld3BvcnRFbmhhbmNlZCA9IGNyZWF0ZVZpZXdwb3J0KHZpZXdwb3J0Q29uZmlnIGFzIGFueSkoY29tcG9uZW50KTtcblxuICAgIC8vIEhhbmRsZSBwYXJlbnQgZWxlbWVudCBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcucGFyZW50IHx8IGNvbmZpZy5jb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcjtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICB0eXBlb2YgY29udGFpbmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcilcbiAgICAgICAgICA6IGNvbnRhaW5lcjtcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgdmlld3BvcnRFbmhhbmNlZC5lbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodmlld3BvcnRFbmhhbmNlZC5lbGVtZW50KTtcblxuICAgICAgICAvLyBFbnN1cmUgdmlld3BvcnQgaXMgaW5pdGlhbGl6ZWQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcbiAgICAgICAgaWYgKHZpZXdwb3J0RW5oYW5jZWQudmlld3BvcnQgJiYgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCLwn5OLIFtWTGlzdF0gSW5pdGlhbGl6aW5nIHZpZXdwb3J0IGFmdGVyIERPTSBhdHRhY2htZW50XCIpO1xuICAgICAgICAgIHZpZXdwb3J0RW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpZXdwb3J0RW5oYW5jZWQ7XG4gIH07XG59O1xuIiwKICAgICIvKipcbiAqIEFQSSBmZWF0dXJlIGZvciBWTGlzdFxuICogUHJvdmlkZXMgYSBjbGVhbiBwdWJsaWMgQVBJIGZvciB0aGUgVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtLCBSZW1vdmVJdGVtT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vLyBSZS1leHBvcnQgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCB3aXRoQVBJID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBhbnkpID0+IHtcbiAgICAvLyBJbml0aWFsaXplIHZpZXdwb3J0IG9uIGNyZWF0aW9uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0ICYmIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG5cbiAgICAvLyBUcmFjayBsb2FkaW5nIHN0YXRlXG4gICAgbGV0IGlzTG9hZGluZyA9IGZhbHNlO1xuICAgIGxldCBzZWxlY3RlZElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gVHJhY2sgcGVuZGluZyByZW1vdmFscyB0byBmaWx0ZXIgb3V0IGl0ZW1zIGZyb20gc3RhbGUgc2VydmVyIHJlc3BvbnNlc1xuICAgIC8vIFRoaXMgcHJldmVudHMgcmFjZSBjb25kaXRpb25zIHdoZXJlIHNlcnZlciByZXR1cm5zIG9sZCBkYXRhIGJlZm9yZSB1cGRhdGVzIGFyZSBjb21taXR0ZWRcbiAgICBjb25zdCBwZW5kaW5nUmVtb3ZhbHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBldmVudHNcbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsICgpID0+IHtcbiAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1mYWlsZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBEYXRhIG9wZXJhdGlvbnNcbiAgICAgIHNldEl0ZW1zKGl0ZW1zOiBUW10pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldEl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6c2V0XCIsIHsgaXRlbXMsIHRvdGFsOiBpdGVtcy5sZW5ndGggfSk7XG4gICAgICB9LFxuXG4gICAgICBnZXRJdGVtcygpOiBUW10ge1xuICAgICAgICAvLyBDb2xsZWN0aW9uIGlzIGFkZGVkIGRpcmVjdGx5IHRvIGNvbXBvbmVudCwgbm90IHRvIHZpZXdwb3J0LmNvbGxlY3Rpb25cbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtcykge1xuICAgICAgICAgIHJldHVybiAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5nZXRJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuaXRlbXMgfHwgW107XG4gICAgICB9LFxuXG4gICAgICBnZXRWaXNpYmxlSXRlbXMoKTogVFtdIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZSgpIHx8IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICB9LFxuXG4gICAgICBnZXRJdGVtQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IGNvbXBvbmVudC5pdGVtcz8ubGVuZ3RoIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXRyaWV2ZVxuICAgICAgICogQHJldHVybnMgVGhlIGl0ZW0gYXQgdGhlIGluZGV4LCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAgICAgKi9cbiAgICAgIGdldEl0ZW0oaW5kZXg6IG51bWJlcik6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/LmdldEl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbShpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIHJldHVybiBpdGVtc1tpbmRleF07XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIG5ldyBpdGVtIGRhdGEgKGZ1bGwgcmVwbGFjZW1lbnQpXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZUl0ZW0oaW5kZXg6IG51bWJlciwgaXRlbTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSB1cGRhdGVJdGVtOiBpbmRleCAke2luZGV4fSBvdXQgb2YgYm91bmRzYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIGZlYXR1cmUgdG8gaGFuZGxlIERPTSB1cGRhdGVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlIGl0ZW0gYnkgSURcbiAgICAgICAqIEZpbmRzIHRoZSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBJRCBhbmQgdXBkYXRlcyBpdCB3aXRoIG5ldyBkYXRhXG4gICAgICAgKiBSZS1yZW5kZXJzIHRoZSBpdGVtIGlmIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZFxuICAgICAgICogQHBhcmFtIGRhdGEgLSBQYXJ0aWFsIGRhdGEgdG8gbWVyZ2Ugd2l0aCBleGlzdGluZyBpdGVtLCBvciBmdWxsIGl0ZW0gcmVwbGFjZW1lbnRcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVXBkYXRlIG9wdGlvbnNcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXRlbSB3YXMgZm91bmQgYW5kIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtQnlJZChcbiAgICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgZGF0YTogUGFydGlhbDxUPixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC8qKiBJZiB0cnVlLCByZXBsYWNlIHRoZSBlbnRpcmUgaXRlbSBpbnN0ZWFkIG9mIG1lcmdpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIHJlcGxhY2U/OiBib29sZWFuO1xuICAgICAgICAgIC8qKiBJZiB0cnVlLCByZS1yZW5kZXIgZXZlbiBpZiBub3QgdmlzaWJsZSAoZGVmYXVsdDogZmFsc2UpICovXG4gICAgICAgICAgZm9yY2VSZW5kZXI/OiBib29sZWFuO1xuICAgICAgICB9ID0ge30sXG4gICAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGl0ZW0gYnkgSUQgKGhhbmRsZSBzcGFyc2UgYXJyYXlzIGZyb20gcGFnaW5hdGlvbilcbiAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyBzaW5jZSBpdGVtcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSUQgc3RydWN0dXJlc1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyAtIHVzZXJfaWQgaXMgaW1wb3J0YW50IGZvciBwcm9maWxlL2NvbnRhY3QgaXRlbXNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbUJ5SWQ6IGl0ZW0gd2l0aCBpZCAke2lkfSBub3QgZm91bmRgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gQ3JlYXRlIHVwZGF0ZWQgaXRlbSAtIGVpdGhlciByZXBsYWNlIGVudGlyZWx5IG9yIG1lcmdlXG4gICAgICAgIGxldCB1cGRhdGVkSXRlbTogVDtcbiAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4uZGF0YSwgaWQ6IHByZXZpb3VzSXRlbS5pZCA/PyBpZCB9IGFzIFQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT25seSBtZXJnZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhY3R1YWwgdmFsdWVzIChub3QgdW5kZWZpbmVkKVxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgcGFydGlhbCB1cGRhdGVzIGZyb20gb3ZlcndyaXRpbmcgZXhpc3RpbmcgZGF0YVxuICAgICAgICAgIHVwZGF0ZWRJdGVtID0geyAuLi5wcmV2aW91c0l0ZW0gfSBhcyBUO1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAodXBkYXRlZEl0ZW0gYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGluIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXlcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLml0ZW1zW2luZGV4XSA9IHVwZGF0ZWRJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIGZlYXR1cmUgdG8gaGFuZGxlIERPTSB1cGRhdGVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW06IHVwZGF0ZWRJdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgY29sbGVjdGlvbiwgdXBkYXRlcyB0b3RhbEl0ZW1zLCBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyXG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlSXRlbShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gcmVtb3ZlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXkgKGNvbXBvbmVudC5jb2xsZWN0aW9uLml0ZW1zIGlzIHRoZSBhY3R1YWwgYXJyYXkpXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSU1QT1JUQU5UOiBFbWl0IGl0ZW06cmVtb3ZlLXJlcXVlc3QgRklSU1Qgc28gcmVuZGVyaW5nIGZlYXR1cmUgcmVidWlsZHMgY29sbGVjdGlvbkl0ZW1zXG4gICAgICAgIC8vIEJFRk9SRSBzZXRUb3RhbEl0ZW1zIHRyaWdnZXJzIGEgcmVuZGVyIHZpYSB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiByZW1vdmVkSXRlbSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHdpbGwgdHJpZ2dlciB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIHdoaWNoIGNhbGxzIHJlbmRlckl0ZW1zXG4gICAgICAgIC8vIEJ5IG5vdywgY29sbGVjdGlvbkl0ZW1zIGhhcyBiZWVuIHJlYnVpbHQgYnkgdGhlIGl0ZW06cmVtb3ZlLXJlcXVlc3QgaGFuZGxlclxuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0VG90YWxJdGVtcyAmJiBjb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byB2aWV3cG9ydC5jb2xsZWN0aW9uIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKFxuICAgICAgICAgICAgTWF0aC5tYXgoMCwgY3VycmVudFRvdGFsIC0gMSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMYXN0IHJlc29ydDogdXBkYXRlIGNvbXBvbmVudC50b3RhbEl0ZW1zIGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gTWF0aC5tYXgoMCwgY29tcG9uZW50LnRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGl0ZW0gYnkgSURcbiAgICAgICAqIEZpbmRzIHRoZSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBJRCBhbmQgcmVtb3ZlcyBpdFxuICAgICAgICogVXBkYXRlcyB0b3RhbEl0ZW1zIGFuZCB0cmlnZ2VycyByZS1yZW5kZXIgb2YgdmlzaWJsZSBpdGVtc1xuICAgICAgICogT3B0aW9uYWxseSB0cmFja3MgYXMgcGVuZGluZyByZW1vdmFsIHRvIGZpbHRlciBmcm9tIGZ1dHVyZSBmZXRjaGVzXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBmaW5kIGFuZCByZW1vdmVcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gUmVtb3ZlIG9wdGlvbnMgKHRyYWNrUGVuZGluZywgcGVuZGluZ1RpbWVvdXQpXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIG9wdGlvbnM6IFJlbW92ZUl0ZW1PcHRpb25zID0ge30sXG4gICAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyB0cmFja1BlbmRpbmcgPSB0cnVlLCBwZW5kaW5nVGltZW91dCA9IDUwMDAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gcmVtb3ZlSXRlbUJ5SWQ6IGludmFsaWQgaWRgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdG8gcGVuZGluZyByZW1vdmFscyB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgc2VydmVyIHJlc3BvbnNlc1xuICAgICAgICBpZiAodHJhY2tQZW5kaW5nKSB7XG4gICAgICAgICAgcGVuZGluZ1JlbW92YWxzLmFkZChpZCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHMgYWZ0ZXIgdGltZW91dCAoc2VydmVyIHNob3VsZCBoYXZlIHVwZGF0ZWQgYnkgdGhlbilcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgICAgIH0sIHBlbmRpbmdUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGl0ZW0gYnkgSUQgKGhhbmRsZSBzcGFyc2UgYXJyYXlzIGZyb20gcGFnaW5hdGlvbilcbiAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyBzaW5jZSBpdGVtcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSUQgc3RydWN0dXJlc1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkc1xuICAgICAgICAgIGNvbnN0IGlkc1RvQ2hlY2sgPSBbaXRlbS5pZCwgaXRlbS5faWQsIGl0ZW0udXNlcl9pZF0uZmlsdGVyKFxuICAgICAgICAgICAgKHYpID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGlkc1RvQ2hlY2suc29tZShcbiAgICAgICAgICAgIChpdGVtSWQpID0+IGl0ZW1JZCA9PT0gaWQgfHwgU3RyaW5nKGl0ZW1JZCkgPT09IFN0cmluZyhpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUl0ZW0oaW5kZXgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhbiBpdGVtIElEIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gY2hlY2tcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGl0ZW0gaXMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKi9cbiAgICAgIGlzUGVuZGluZ1JlbW92YWwoaWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcGVuZGluZ1JlbW92YWxzLmhhcyhpZCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgcGVuZGluZyByZW1vdmFsIElEc1xuICAgICAgICogQHJldHVybnMgU2V0IG9mIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqL1xuICAgICAgZ2V0UGVuZGluZ1JlbW92YWxzKCk6IFNldDxzdHJpbmcgfCBudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQocGVuZGluZ1JlbW92YWxzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYSBzcGVjaWZpYyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNsZWFyIGZyb20gcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhclBlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmRlbGV0ZShpZCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBwZW5kaW5nIHJlbW92YWxzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyQWxsUGVuZGluZ1JlbW92YWxzKCk6IHZvaWQge1xuICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuY2xlYXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRmlsdGVyIGl0ZW1zIGFycmF5IHRvIGV4Y2x1ZGUgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICogVXRpbGl0eSBtZXRob2QgZm9yIHVzZSBpbiBjb2xsZWN0aW9uIGFkYXB0ZXJzXG4gICAgICAgKiBAcGFyYW0gaXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBmaWx0ZXJcbiAgICAgICAqIEByZXR1cm5zIEZpbHRlcmVkIGFycmF5IHdpdGhvdXQgcGVuZGluZyByZW1vdmFsIGl0ZW1zXG4gICAgICAgKi9cbiAgICAgIGZpbHRlclBlbmRpbmdSZW1vdmFsczxJIGV4dGVuZHMgeyBpZD86IGFueTsgX2lkPzogYW55IH0+KFxuICAgICAgICBpdGVtczogSVtdLFxuICAgICAgKTogSVtdIHtcbiAgICAgICAgaWYgKHBlbmRpbmdSZW1vdmFscy5zaXplID09PSAwKSByZXR1cm4gaXRlbXM7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gaXRlbS5faWQgfHwgaXRlbS5pZDtcbiAgICAgICAgICByZXR1cm4gIXBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExvYWRpbmcgb3BlcmF0aW9uc1xuICAgICAgYXN5bmMgbG9hZFJhbmdlKFxuICAgICAgICBwYWdlOiBudW1iZXIsXG4gICAgICAgIGxpbWl0OiBudW1iZXIsXG4gICAgICAgIHN0cmF0ZWd5OiBzdHJpbmcgPSBcInBhZ2VcIixcbiAgICAgICAgYWxpZ25tZW50Pzogc3RyaW5nLFxuICAgICAgKSB7XG4gICAgICAgIGlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHN0cmF0ZWd5ID09PSBcInBhZ2VcIiA/IChwYWdlIC0gMSkgKiBsaW1pdCA6IHBhZ2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRSYW5nZShvZmZzZXQsIGxpbWl0KTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJsb2FkXCIsIHsgcGFnZSwgbGltaXQsIHN0cmF0ZWd5IH0pO1xuXG4gICAgICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIGxvYWRlZCByYW5nZSBpZiBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkXG4gICAgICAgICAgICBpZiAoYWxpZ25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJlcnJvclwiLCB7IGVycm9yIH0pO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gRGF0YSBsb2FkaW5nXG4gICAgICBsb2FkTmV4dDogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZMaXN0XSBsb2FkTmV4dCgpYCk7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IHVubG9hZGVkIHJhbmdlXG4gICAgICAgICAgbGV0IG5leHRPZmZzZXQgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3QgcmFuZ2VJZCBvZiBsb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRW5kID0gKHJhbmdlSWQgKyAxKSAqIChjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjApO1xuICAgICAgICAgICAgaWYgKHJhbmdlRW5kID4gbmV4dE9mZnNldCkge1xuICAgICAgICAgICAgICBuZXh0T2Zmc2V0ID0gcmFuZ2VFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5leHRPZmZzZXQgPCB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2UoXG4gICAgICAgICAgICAgIG5leHRPZmZzZXQsXG4gICAgICAgICAgICAgIGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCB8fCAyMCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNMb2FkaW5nO1xuICAgICAgfSxcblxuICAgICAgaGFzTmV4dCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHRvdGFsID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgICByZXR1cm4gaXRlbXMubGVuZ3RoIDwgdG90YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLy8gTm90ZTogU2VsZWN0aW9uIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlIHdpdGhTZWxlY3Rpb24gZmVhdHVyZVxuICAgICAgLy8gVGhlc2UgYXJlIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IGRlbGVnYXRlIHRvIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgZ2V0U2VsZWN0ZWRJZHMoKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBjb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgICAgcmV0dXJuIGluZGljZXMubWFwKChpZHg6IG51bWJlcikgPT4gKGl0ZW1zW2lkeF0gYXMgYW55KT8uaWQgfHwgaWR4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShzZWxlY3RlZElkcyk7XG4gICAgICB9LFxuXG4gICAgICBzZWxlY3RJdGVtKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuc2VsZWN0SXRlbXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRlc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmRlc2VsZWN0SXRlbXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICAgIHNlbGVjdGVkSWRzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmNsZWFyU2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29tcG9uZW50LmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHsgc2VsZWN0ZWQ6IFtdIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBTY3JvbGxpbmcgbWV0aG9kc1xuICAgICAgc2Nyb2xsVG9JbmRleDogKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgdG8gaW5kZXggYW5kIHNlbGVjdCBpdGVtIGFmdGVyIGRhdGEgbG9hZHNcbiAgICAgICAqIFVzZWZ1bCBmb3IgcnVudGltZSBzY3JvbGwrc2VsZWN0IHdoZW4gVkxpc3QgaXMgYWxyZWFkeSBjcmVhdGVkXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbFRvSW5kZXhBbmRTZWxlY3Q6IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIHJhbmdlIGxvYWQgdG8gY29tcGxldGUsIHRoZW4gc2VsZWN0XG4gICAgICAgIGNvbnN0IG9uUmFuZ2VMb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LnNlbGVjdEJ5SWQpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LnNlbGVjdEJ5SWQoc2VsZWN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnNlbGVjdEJ5SWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDMwMCk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9JdGVtOiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGl0ZW1JZDogc3RyaW5nLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoXG4gICAgICAgICAgKGl0ZW06IGFueSkgPT4gU3RyaW5nKGl0ZW0uaWQpID09PSBTdHJpbmcoaXRlbUlkKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCwgYW5pbWF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLndhcm4oYEl0ZW0gJHtpdGVtSWR9IG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KDAsIFwic3RhcnRcIik7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb0JvdHRvbTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdGhpcy5nZXRJdGVtQ291bnQoKTtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCh0b3RhbEl0ZW1zIC0gMSwgXCJlbmRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9QYWdlOiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIHBhZ2VOdW06IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtWTGlzdF0gc2Nyb2xsVG9QYWdlKCR7cGFnZU51bX0pYCk7XG5cbiAgICAgICAgLy8gR2V0IGxpbWl0IGZyb20gY29uZmlnIChyYW5nZVNpemUpIG9yIGRlZmF1bHRcbiAgICAgICAgY29uc3QgbGltaXQgPSBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjA7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gY3Vyc29yIG1vZGVcbiAgICAgICAgaWYgKGNvbmZpZy5wYWdpbmF0aW9uPy5zdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB3ZSBuZWVkIHRvIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgICAgY29uc3QgaGlnaGVzdExvYWRlZFBhZ2UgPSBsb2FkZWRSYW5nZXMuc2l6ZTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPiBoaWdoZXN0TG9hZGVkUGFnZSArIDEpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGBbVkxpc3RdIENhbm5vdCBqdW1wIHRvIHBhZ2UgJHtwYWdlTnVtfSBpbiBjdXJzb3IgbW9kZS4gYCArXG4gICAgICAgICAgICAgICAgICBgTG9hZGluZyBwYWdlcyBzZXF1ZW50aWFsbHkgZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgICAgICAgIH0gdG8gJHtwYWdlTnVtfWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHZpZXdwb3J0J3Mgc2Nyb2xsVG9QYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5zY3JvbGxUb1BhZ2UpIHtcbiAgICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9QYWdlKHBhZ2VOdW0sIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHNjcm9sbFRvSW5kZXhcbiAgICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IChwYWdlTnVtIC0gMSkgKiBsaW1pdDtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbFRvSW5kZXgodGFyZ2V0SW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcbiAgICAgIH0sXG5cbiAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24/LmdldEN1cnJlbnRDdXJzb3I/LigpIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICBzZXRTY3JvbGxBbmltYXRpb24oZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICAvLyBTdG9yZSBhbmltYXRpb24gcHJlZmVyZW5jZSAod291bGQgYmUgdXNlZCBieSB2aWV3cG9ydCBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgICAgY29tcG9uZW50LnNjcm9sbEFuaW1hdGlvbiA9IGVuYWJsZWQ7XG4gICAgICB9LFxuXG4gICAgICAvLyBTdGF0ZVxuICAgICAgZ2V0U3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXRlbXM6IHRoaXMuZ2V0SXRlbXMoKSxcbiAgICAgICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb25cbiAgICAgICAgICAgID8gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpXG4gICAgICAgICAgICA6IGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgICAgdmlzaWJsZVJhbmdlOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZSgpIHx8IHtcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgICAgIHNlbGVjdGVkSWRzOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZygpLFxuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgLy8gTGlmZWN5Y2xlXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5kZXN0cm95KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZGVzdHJveWVkXCIpO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBtdHJsLWFkZG9ucyBMaXN0IENvbXBvbmVudCBDb25zdGFudHNcbiAqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBhZGRvbnMgbGlzdCBjb21wb25lbnQuXG4gKiBOb3RlOiBCYXNlIG10cmwgbGlzdCBmdW5jdGlvbmFsaXR5IGlzIGhhbmRsZWQgYnkgbXRybCBjb3JlLlxuICogVGhlc2UgY29uc3RhbnRzIGFyZSBmb3IgYWRkb25zLXNwZWNpZmljIGZlYXR1cmVzIG9ubHkuXG4gKi9cblxuLyoqXG4gKiBDU1MgY2xhc3MgbmFtZXMgZm9yIFZMaXN0IGNvbXBvbmVudFxuICogRm9sbG93aW5nIEJFTSBjb252ZW50aW9uOiBjb21wb25lbnRfX2VsZW1lbnQtLW1vZGlmaWVyXG4gKiBOb3RlOiBtdHJsIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvcmUgRE9NIGNsYXNzZXMgc3lzdGVtXG4gKi9cbmV4cG9ydCBjb25zdCBWTElTVF9DTEFTU0VTID0ge1xuICAvKiogTGlzdCBlbGVtZW50ICovXG4gIExJU1Q6IFwidmxpc3RcIixcbiAgLyoqIExpc3QgaXRlbSAqL1xuICBJVEVNOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgLyoqIFNlbGVjdGVkIGxpc3QgaXRlbSAqL1xuICBTRUxFQ1RFRDogXCJ2aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiLFxuICAvKiogRW1wdHkgc3RhdGUgKi9cbiAgRU1QVFk6IFwidmxpc3QtLWVtcHR5XCIsXG59IGFzIGNvbnN0O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy92bGlzdC9mZWF0dXJlcy9zZWxlY3Rpb24udHNcblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RDb21wb25lbnQsIFZMaXN0SXRlbSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVkxJU1RfQ0xBU1NFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBTZWxlY3Rpb24gc3RhdGUgaW50ZXJmYWNlXG4gKi9cbmludGVyZmFjZSBTZWxlY3Rpb25TdGF0ZSB7XG4gIHNlbGVjdGVkSWRzOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPjtcbiAgbW9kZTogXCJub25lXCIgfCBcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwiO1xuICBsYXN0U2VsZWN0ZWRJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgaXRlbSBJRCBmcm9tIGVsZW1lbnQgb3IgaXRlbSBkYXRhXG4gKi9cbmNvbnN0IGdldEl0ZW1JZCA9IChpdGVtOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoaXRlbT8uaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGl0ZW0uaWQ7XG4gIGlmIChpdGVtPy5faWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGl0ZW0uX2lkO1xuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHJldHVybiBpdGVtO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBBZGRzIHNlbGVjdGlvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byBWTGlzdCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTZWxlY3Rpb24gPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IFZMaXN0Q29tcG9uZW50PFQ+KTogVkxpc3RDb21wb25lbnQ8VD4gPT4ge1xuICAgIGlmICghY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm5vbmVcIikge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZTogU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgICBzZWxlY3RlZElkczogbmV3IFNldCgpLFxuICAgICAgbW9kZTogY29uZmlnLnNlbGVjdGlvbj8ubW9kZSB8fCBcInNpbmdsZVwiLFxuICAgICAgbGFzdFNlbGVjdGVkSW5kZXg6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVxdWlyZU1vZGlmaWVycyA9IGNvbmZpZy5zZWxlY3Rpb24/LnJlcXVpcmVNb2RpZmllcnMgPz8gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBzZWxlY3Rpb24gY2xhc3MgdG8gcmVuZGVyZWQgZWxlbWVudHMgbWF0Y2hpbmcgc2VsZWN0ZWQgSURzXG4gICAgICovXG4gICAgY29uc3QgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1zYCxcbiAgICAgICk7XG4gICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpdGVtcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaWRdYCxcbiAgICAgICk7XG5cbiAgICAgIGl0ZW1zLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmRhdGFzZXQuaWQ7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgYm90aCBzdHJpbmcgYW5kIG51bWJlciB2ZXJzaW9ucyBvZiB0aGUgSURcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID1cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkgfHwgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKE51bWJlcihpZCkpO1xuICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWTElTVF9DTEFTU0VTLlNFTEVDVEVEKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGl0ZW0gY2xpY2sgZm9yIHNlbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUl0ZW1DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB2aWV3cG9ydEl0ZW0gPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICghdmlld3BvcnRJdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQodmlld3BvcnRJdGVtLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiKTtcbiAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCk7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXM/LltpbmRleF07XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW1JZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGl0ZW1JZCk7XG5cbiAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIGlmICghd2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAoIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VJdGVtID0gaXRlbXM/LltpXTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbUlkID0gZ2V0SXRlbUlkKHJhbmdlSXRlbSk7XG4gICAgICAgICAgICBpZiAocmFuZ2VJdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQocmFuZ2VJdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7XG4gICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcXVpcmVNb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgc2VsZWN0aW9uIGNoYW5nZSBldmVudFxuICAgICAqL1xuICAgIGNvbnN0IGVtaXRTZWxlY3Rpb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IGl0ZW1zLnJlZHVjZShcbiAgICAgICAgKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBhY2MucHVzaChpZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgICk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHsgc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzIH0pO1xuXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ub25TZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgICAgY29uZmlnLnNlbGVjdGlvbi5vblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZEl0ZW1zLCBzZWxlY3RlZEluZGljZXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXR1cDogbGlzdGVuIGZvciByZW5kZXJzIGFuZCBjbGlja3NcbiAgICBjb25zdCBzZXR1cCA9ICgpID0+IHtcbiAgICAgIC8vIEFkZCBtb2RlIGNsYXNzIHRvIGNvbnRhaW5lclxuICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGFkZENsYXNzKGNvbXBvbmVudC5lbGVtZW50LCBcInZsaXN0LS1zZWxlY3Rpb25cIik7XG4gICAgICAgIGFkZENsYXNzKGNvbXBvbmVudC5lbGVtZW50LCBgdmxpc3QtLXNlbGVjdGlvbi0ke3N0YXRlLm1vZGV9YCk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVJdGVtQ2xpY2ssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBzZWxlY3Rpb24gYWZ0ZXIgZWFjaCByZW5kZXJcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyxcbiAgICAgICk7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHNlbGVjdGlvbiB3aGVuIGl0ZW0gaXMgcmVtb3ZlZFxuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICAgIFwiaXRlbTpyZW1vdmVkXCIsXG4gICAgICAgIChkYXRhOiB7IGl0ZW06IGFueTsgaW5kZXg6IG51bWJlciB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGRhdGEuaXRlbSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZW1vdmVkIGl0ZW0gd2FzIHRoZSBsYXN0IHNlbGVjdGVkIGluZGV4LCBjbGVhciBpdFxuICAgICAgICAgICAgaWYgKHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID09PSBkYXRhLmluZGV4KSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA+IGRhdGEuaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZGp1c3QgbGFzdFNlbGVjdGVkSW5kZXggc2luY2UgaXRlbXMgc2hpZnRlZCBkb3duXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhZnRlciBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBzZXRUaW1lb3V0KHNldHVwLCAwKTtcblxuICAgIC8vIExpc3RlbiBmb3IgaW5pdGlhbCBsb2FkIGNvbXBsZXRlIHRvIGF1dG8tc2VsZWN0IGl0ZW1cbiAgICAvLyBUaGlzIG11c3QgYmUgaW4gd2l0aFNlbGVjdGlvbiBiZWNhdXNlIHNlbGVjdEJ5SWQgaXMgZGVmaW5lZCBoZXJlXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICBcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsXG4gICAgICAoZGF0YTogeyBzZWxlY3RJZDogc3RyaW5nIHwgbnVtYmVyIH0pID0+IHtcbiAgICAgICAgaWYgKGRhdGE/LnNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBVc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGVuc3VyZSByZW5kZXJpbmcgaXMgY29tcGxldGVcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChkYXRhLnNlbGVjdElkKTtcbiAgICAgICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcblxuICAgIC8vIEVuaGFuY2VkIGNvbXBvbmVudCB3aXRoIHNlbGVjdGlvbiBBUElcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICBzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICAvLyBJbiBzaW5nbGUgbW9kZSwgY2xlYXIgcHJldmlvdXMgc2VsZWN0aW9uIGJlZm9yZSBhZGRpbmcgbmV3IG9uZVxuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgaW5kaWNlcyA9IFtpbmRpY2VzWzBdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zW2luZGV4XSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW1zKGluZGljZXM6IG51bWJlcltdKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgICBpbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zW2luZGV4XSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBnZXRTZWxlY3RlZEl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIHJldHVybiBpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJbmRpY2VzKCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBudW1iZXJbXSwgaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSBhcyBudW1iZXJbXSk7XG4gICAgICB9LFxuXG4gICAgICBpc1NlbGVjdGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zPy5baW5kZXhdKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0QnlJZChpZDogc3RyaW5nIHwgbnVtYmVyLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpZCk7XG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGl0ZW0gYXQgaW5kZXgsIHNjcm9sbGluZyBhbmQgd2FpdGluZyBmb3IgZGF0YSBpZiBuZWVkZWRcbiAgICAgICAqIEhhbmRsZXMgdmlydHVhbCBzY3JvbGxpbmcgYnkgbG9hZGluZyBkYXRhIGJlZm9yZSBzZWxlY3RpbmdcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0QXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCBzY3JvbGwgdG8gdGhlIGluZGV4ICh0cmlnZ2VycyBkYXRhIGxvYWRpbmcgaWYgbmVlZGVkKVxuICAgICAgICBpZiAoZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0byBzZWxlY3QgaW1tZWRpYXRlbHkgLSB3b3JrcyBpZiBpdGVtIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICBpZiAoaXRlbXNbaW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEl0ZW0gbm90IGxvYWRlZCB5ZXQgLSB3YWl0IGZvciBkYXRhIHRvIGxvYWQgdGhlbiBzZWxlY3RcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgbGV0IHJlc29sdmVkID0gZmFsc2U7XG5cbiAgICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdGltZW91dCBpbiBjYXNlIGV2ZW50IGRvZXNuJ3QgZmlyZSAoZGF0YSBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBuZXh0IGl0ZW0gcmVsYXRpdmUgdG8gY3VycmVudCBzZWxlY3Rpb25cbiAgICAgICAqIEhhbmRsZXMgdmlydHVhbCBzY3JvbGxpbmcgYnkgbG9hZGluZyBkYXRhIGJlZm9yZSBzZWxlY3RpbmdcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TmV4dCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSB0aGlzLmdldFNlbGVjdGVkSW5kaWNlcygpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gU2VsZWN0IGZpcnN0IGl0ZW1cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuXG4gICAgICAgIGlmIChuZXh0SW5kZXggPCB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXRJbmRleChuZXh0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgcHJldmlvdXMgaXRlbSByZWxhdGl2ZSB0byBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgICogSGFuZGxlcyB2aXJ0dWFsIHNjcm9sbGluZyBieSBsb2FkaW5nIGRhdGEgYmVmb3JlIHNlbGVjdGluZ1xuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3RQcmV2aW91cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlc1swXTtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHByZXZJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoU2VsZWN0aW9uO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCTyxTQUFTLFdBQVcsQ0FDekIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQTtBQVl2RCxTQUFTLFFBQVEsQ0FDdEIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsTUFBTSxRQUFTLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFLElBQUksTUFBTyxLQUFLO0FBQUEsRUFDMUQsT0FBTyxRQUFRLElBQUksUUFBUSxNQUFNO0FBQUE7QUFXNUIsU0FBUyxrQkFBa0IsQ0FDaEMsTUFDQSxlQUNBLE9BQ2M7QUFBQSxFQUNkLE1BQU0sVUFBVSxLQUFLLElBQUk7QUFBQSxFQUN6QixJQUFJLG1CQUFtQjtBQUFBLEVBRXZCLE1BQU0sUUFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBLFFBQ0csTUFBTSxVQUEyQixjQUFjO0FBQUEsSUFDbEQsV0FBVyxN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Q1A7QUFBQTtBQUFBLFdBT0csV0FBVSxHQUFxQjtBQUFBLFFBQ25DLE1BQU0sb0JBQW9CO0FBQUEsUUFDMUIsTUFBTSxrQkFBa0IsS0FBSyxtQkFBbUI7QUFBQSxRQUVoRCxJQUFJLGdCQUFnQixXQUFXLEdBQUc7QUFBQSxVQUVoQyxPQUFPLEtBQUssY0FBYyxDQUFDO0FBQUEsUUFDN0I7QUFBQSxRQUVBLE1BQU0sZUFBZSxnQkFBZ0I7QUFBQSxRQUNyQyxNQUFNLFlBQVksZUFBZTtBQUFBLFFBQ2pDLE1BQU0sYUFBYSxrQkFBa0IsZUFBZSxLQUFLO0FBQUEsUUFFekQsSUFBSSxZQUFZLFlBQVk7QUFBQSxVQUMxQixPQUFPLEtBQUssY0FBYyxTQUFTO0FBQUEsUUFDckM7QUFBQSxRQUVBLE9BQU87QUFBQTtBQUFBLFdBT0gsZUFBYyxHQUFxQjtBQUFBLFFBQ3ZDLE1BQU0sa0JBQWtCLEtBQUssbUJBQW1CO0FBQUEsUUFFaEQsSUFBSSxnQkFBZ0IsV0FBVyxHQUFHO0FBQUEsVUFDaEMsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUVBLE1BQU0sZUFBZSxnQkFBZ0I7QUFBQSxRQUNyQyxNQUFNLFlBQVksZUFBZTtBQUFBLFFBRWpDLElBQUksYUFBYSxHQUFHO0FBQUEsVUFDbEIsT0FBTyxLQUFLLGNBQWMsU0FBUztBQUFBLFFBQ3JDO0FBQUEsUUFFQSxPQUFPO0FBQUE7QUFBQSxJQUVYO0FBQUE7QUFBQTs7O0FKcllHLElBQU0sY0FBYyxDQUN6QixTQUF5QixDQUFDLE1BQ0o7QUFBQSxFQUN0QixJQUFJO0FBQUEsSUFPRixNQUFNLFlBQVk7QUFBQSxNQUVoQjtBQUFBLE1BQ0EseUJBQVc7QUFBQSxNQUNYLDBCQUFZO0FBQUEsUUFDVixLQUFLO0FBQUEsUUFDTCxXQUFXLE9BQU8sYUFBYTtBQUFBLFFBQy9CLFlBQVk7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLGNBQWMsT0FBTyxhQUFhO0FBQUEsUUFDcEM7QUFBQSxNQUNGLENBQUM7QUFBQSxNQUlELGFBQWE7QUFBQSxXQUNSO0FBQUEsUUFDSCxpQkFBaUIsT0FBTyxXQUFXO0FBQUEsTUFDckMsQ0FBQztBQUFBLE1BR0QsNEJBQWM7QUFBQSxNQUdkLFFBQVEsTUFBTTtBQUFBLElBQ2hCO0FBQUEsSUFHQSxJQUFJLE9BQU8sV0FBVyxTQUFTO0FBQUEsTUFDN0IsVUFBVSxLQUFLLGNBQWMsTUFBTSxDQUFDO0FBQUEsSUFDdEM7QUFBQSxJQUVBLE1BQU0sYUFBWSxtQkFBSyxHQUFHLFNBQVMsRUFBRTtBQUFBLFNBQ2hDO0FBQUEsTUFDSCxlQUFlO0FBQUEsTUFDZixRQUFRLE9BQU8sVUFBVTtBQUFBLElBQzNCLENBQUM7QUFBQSxJQUVELE9BQU87QUFBQSxJQUNQLE9BQU8sT0FBTztBQUFBLElBQ2QsUUFBUSxNQUFNLCtDQUE4QyxLQUFLO0FBQUEsSUFDakUsTUFBTTtBQUFBO0FBQUE7IiwKICAiZGVidWdJZCI6ICI1QkRGNzgyODAyODUyNTc3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
5151
+ // src/components/form/features/layout.ts
5152
+ var createFormElement = (config) => {
5153
+ const form = document.createElement("form");
5154
+ if (config.method) {
5155
+ form.setAttribute("method", config.method);
5156
+ }
5157
+ if (config.action) {
5158
+ form.setAttribute("action", config.action);
5159
+ }
5160
+ if (config.autocomplete) {
5161
+ form.setAttribute("autocomplete", config.autocomplete);
5162
+ }
5163
+ form.addEventListener("submit", (e) => {
5164
+ e.preventDefault();
5165
+ });
5166
+ return form;
5167
+ };
5168
+ var processLayoutSchema = (schema, form, config) => {
5169
+ if (!schema || !Array.isArray(schema) || schema.length === 0) {
5170
+ return { ui: {}, layoutResult: null };
5171
+ }
5172
+ const layoutResult = createLayout(schema, form, {});
5173
+ const ui = {};
5174
+ if (layoutResult && typeof layoutResult === "object") {
5175
+ const result = layoutResult;
5176
+ if (result.component) {
5177
+ Object.assign(ui, result.component);
5178
+ }
5179
+ }
5180
+ return { ui, layoutResult };
5181
+ };
5182
+ var withLayout = (config) => {
5183
+ return (component2) => {
5184
+ const form = createFormElement(config);
5185
+ if (component2.element) {
5186
+ component2.element.appendChild(form);
5187
+ }
5188
+ const { ui, layoutResult } = config.layout ? processLayoutSchema(config.layout, form, config) : { ui: {}, layoutResult: null };
5189
+ return {
5190
+ ...component2,
5191
+ form,
5192
+ ui,
5193
+ layoutResult
5194
+ };
5195
+ };
5196
+ };
5197
+ // src/components/form/constants.ts
5198
+ var DATA_STATE = {
5199
+ PRISTINE: "pristine",
5200
+ DIRTY: "dirty"
5201
+ };
5202
+ var FORM_EVENTS = {
5203
+ CHANGE: "change",
5204
+ SUBMIT: "submit",
5205
+ STATE_CHANGE: "state:change",
5206
+ DATA_SET: "data:set",
5207
+ DATA_GET: "data:get",
5208
+ FIELD_CHANGE: "field:change",
5209
+ VALIDATION_ERROR: "validation:error",
5210
+ SUBMIT_SUCCESS: "submit:success",
5211
+ SUBMIT_ERROR: "submit:error",
5212
+ RESET: "reset"
5213
+ };
5214
+ var FORM_CLASSES = {
5215
+ MODIFIED: "modified",
5216
+ SUBMITTING: "submitting",
5217
+ DISABLED: "disabled"
5218
+ };
5219
+ var FORM_DEFAULTS = {
5220
+ prefix: "mtrl",
5221
+ componentName: "form",
5222
+ tag: "div",
5223
+ formTag: "form",
5224
+ method: "POST",
5225
+ autocomplete: "off",
5226
+ useChanges: true,
5227
+ controls: ["submit", "cancel"]
5228
+ };
5229
+
5230
+ // src/components/form/config.ts
5231
+ var createBaseConfig = (config = {}) => {
5232
+ return {
5233
+ ...FORM_DEFAULTS,
5234
+ ...config,
5235
+ prefix: config.prefix || FORM_DEFAULTS.prefix,
5236
+ componentName: config.componentName || FORM_DEFAULTS.componentName,
5237
+ controls: config.controls !== undefined ? config.controls : [...FORM_DEFAULTS.controls],
5238
+ sysinfo: config.sysinfo || [],
5239
+ validation: config.validation || [],
5240
+ on: config.on || {}
5241
+ };
5242
+ };
5243
+ var createInitialState = (config) => {
5244
+ const initialData = config.data ? { ...config.data } : {};
5245
+ return {
5246
+ modified: false,
5247
+ submitting: false,
5248
+ disabled: false,
5249
+ initialData,
5250
+ currentData: { ...initialData },
5251
+ errors: {}
5252
+ };
5253
+ };
5254
+ var getElementConfig = (config) => {
5255
+ const prefix = config.prefix || FORM_DEFAULTS.prefix;
5256
+ const componentName = config.componentName || FORM_DEFAULTS.componentName;
5257
+ const classNames = [`${prefix}-${componentName}`];
5258
+ if (config.class) {
5259
+ classNames.push(config.class);
5260
+ }
5261
+ return {
5262
+ tag: "div",
5263
+ className: classNames.join(" "),
5264
+ attributes: {
5265
+ "data-component": componentName
5266
+ }
5267
+ };
5268
+ };
5269
+ var extractFieldName = (prefixedName) => {
5270
+ const parts = prefixedName.split(".");
5271
+ return parts.length > 1 ? parts.slice(1).join(".") : prefixedName;
5272
+ };
5273
+ var isFieldName = (name) => {
5274
+ return name.startsWith("info.") || name.startsWith("data.");
5275
+ };
5276
+ var isFileName = (name) => {
5277
+ return name.startsWith("file.");
5278
+ };
5279
+ var isValueEqual = (a, b) => {
5280
+ if (a === b)
5281
+ return true;
5282
+ if (a == null || b == null)
5283
+ return a == b;
5284
+ if (Array.isArray(a) && Array.isArray(b)) {
5285
+ if (a.length !== b.length)
5286
+ return false;
5287
+ return a.every((val, idx) => isValueEqual(val, b[idx]));
5288
+ }
5289
+ if (typeof a === "object" && typeof b === "object") {
5290
+ const keysA = Object.keys(a);
5291
+ const keysB = Object.keys(b);
5292
+ if (keysA.length !== keysB.length)
5293
+ return false;
5294
+ return keysA.every((key) => isValueEqual(a[key], b[key]));
5295
+ }
5296
+ return a == b;
5297
+ };
5298
+ var hasDataChanged = (initial, current) => {
5299
+ const allKeys = new Set([...Object.keys(initial), ...Object.keys(current)]);
5300
+ for (const key of allKeys) {
5301
+ if (!isValueEqual(initial[key], current[key])) {
5302
+ return true;
5303
+ }
5304
+ }
5305
+ return false;
5306
+ };
5307
+ var getModifiedFields = (initial, current) => {
5308
+ const modified = {};
5309
+ const allKeys = new Set([...Object.keys(initial), ...Object.keys(current)]);
5310
+ for (const key of allKeys) {
5311
+ if (!isValueEqual(initial[key], current[key])) {
5312
+ modified[key] = current[key];
5313
+ }
5314
+ }
5315
+ return modified;
5316
+ };
5317
+
5318
+ // src/components/form/features/fields.ts
5319
+ var isFormField = (obj) => {
5320
+ if (!obj || typeof obj !== "object")
5321
+ return false;
5322
+ const candidate = obj;
5323
+ if (!candidate.element || !(candidate.element instanceof HTMLElement)) {
5324
+ return false;
5325
+ }
5326
+ return typeof candidate.getValue === "function" || typeof candidate.setValue === "function";
5327
+ };
5328
+ var getFieldValue = (field) => {
5329
+ if (typeof field.getValue === "function") {
5330
+ return field.getValue();
5331
+ }
5332
+ const fieldAny = field;
5333
+ if ("value" in fieldAny) {
5334
+ return fieldAny.value;
5335
+ }
5336
+ return;
5337
+ };
5338
+ var setFieldValue = (field, value, silent = false) => {
5339
+ const fieldAny = field;
5340
+ if (silent) {
5341
+ const input = fieldAny.input;
5342
+ if (input) {
5343
+ if (input.type === "checkbox") {
5344
+ const shouldBeChecked = value === true || value === "true" || value === 1;
5345
+ input.checked = shouldBeChecked;
5346
+ const element = fieldAny.element;
5347
+ if (element) {
5348
+ const classList = Array.from(element.classList);
5349
+ const baseClass = classList.find((c) => c.startsWith("mtrl-") && !c.includes("--"));
5350
+ if (baseClass) {
5351
+ element.classList.toggle(`${baseClass}--checked`, shouldBeChecked);
5352
+ }
5353
+ }
5354
+ } else {
5355
+ input.value = value ?? "";
5356
+ const element = fieldAny.element;
5357
+ if (element) {
5358
+ const classList = Array.from(element.classList);
5359
+ const baseClass = classList.find((c) => c.startsWith("mtrl-") && !c.includes("--"));
5360
+ if (baseClass) {
5361
+ const isEmpty = !input.value;
5362
+ element.classList.toggle(`${baseClass}--empty`, isEmpty);
5363
+ }
5364
+ }
5365
+ }
5366
+ return;
5367
+ }
5368
+ }
5369
+ if (typeof field.setValue === "function") {
5370
+ field.setValue(value);
5371
+ return;
5372
+ }
5373
+ if ("value" in fieldAny) {
5374
+ fieldAny.value = value;
5375
+ }
5376
+ };
5377
+ var extractFields = (ui, config) => {
5378
+ const fields = new Map;
5379
+ const files = new Map;
5380
+ if (!ui)
5381
+ return { fields, files };
5382
+ for (const [name, component2] of Object.entries(ui)) {
5383
+ if (!isFormField(component2))
5384
+ continue;
5385
+ if (isFieldName(name)) {
5386
+ const fieldName = extractFieldName(name);
5387
+ fields.set(fieldName, component2);
5388
+ } else if (isFileName(name)) {
5389
+ const fileName = extractFieldName(name);
5390
+ files.set(fileName, component2);
5391
+ }
5392
+ }
5393
+ return { fields, files };
5394
+ };
5395
+ var valuesEqual = (a, b) => {
5396
+ if (a === b)
5397
+ return true;
5398
+ if (a == null || b == null)
5399
+ return false;
5400
+ if (Array.isArray(a) && Array.isArray(b)) {
5401
+ if (a.length !== b.length)
5402
+ return false;
5403
+ return a.every((val, i) => val === b[i]);
5404
+ }
5405
+ return false;
5406
+ };
5407
+ var fieldValueTracker = null;
5408
+ var syncTrackedFieldValues = (fields) => {
5409
+ if (fieldValueTracker) {
5410
+ for (const [name, field] of fields) {
5411
+ fieldValueTracker.set(name, getFieldValue(field));
5412
+ }
5413
+ }
5414
+ };
5415
+ var bindFieldEvents = (fields, onFieldChange) => {
5416
+ const lastEmittedValues = new Map;
5417
+ fieldValueTracker = lastEmittedValues;
5418
+ for (const [name, field] of fields) {
5419
+ if (typeof field.on === "function") {
5420
+ lastEmittedValues.set(name, getFieldValue(field));
5421
+ const handleChange = () => {
5422
+ const value = getFieldValue(field);
5423
+ const lastValue = lastEmittedValues.get(name);
5424
+ if (!valuesEqual(value, lastValue)) {
5425
+ lastEmittedValues.set(name, value);
5426
+ onFieldChange(name, value);
5427
+ }
5428
+ };
5429
+ field.on("input", handleChange);
5430
+ field.on("change", handleChange);
5431
+ }
5432
+ }
5433
+ };
5434
+ var withFields = (config) => {
5435
+ return (component2) => {
5436
+ const { fields, files } = extractFields(component2.ui || {}, config);
5437
+ if (component2.emit) {
5438
+ bindFieldEvents(fields, (name, value) => {
5439
+ component2.emit?.("field:change", { name, value });
5440
+ component2.emit?.("change", { name, value });
5441
+ });
5442
+ }
5443
+ return {
5444
+ ...component2,
5445
+ fields,
5446
+ files,
5447
+ getField(name) {
5448
+ return fields.get(name);
5449
+ },
5450
+ getFieldNames() {
5451
+ return Array.from(fields.keys());
5452
+ },
5453
+ hasField(name) {
5454
+ return fields.has(name);
5455
+ }
5456
+ };
5457
+ };
5458
+ };
5459
+ // src/components/form/features/data.ts
5460
+ var collectFieldData = (fields) => {
5461
+ const data = {};
5462
+ for (const [name, field] of fields) {
5463
+ const value = getFieldValue(field);
5464
+ if (value !== undefined) {
5465
+ data[name] = value;
5466
+ }
5467
+ }
5468
+ return data;
5469
+ };
5470
+ var setFieldsData = (fields, data, silent = false) => {
5471
+ for (const [name, field] of fields) {
5472
+ if (name in data) {
5473
+ setFieldValue(field, data[name], silent);
5474
+ continue;
5475
+ }
5476
+ const value = getNestedValue(data, name);
5477
+ if (value !== undefined) {
5478
+ setFieldValue(field, value, silent);
5479
+ }
5480
+ }
5481
+ };
5482
+ var getNestedValue = (obj, path) => {
5483
+ const parts = path.split(".");
5484
+ let current = obj;
5485
+ for (const part of parts) {
5486
+ if (current === null || current === undefined) {
5487
+ return;
5488
+ }
5489
+ if (typeof current !== "object") {
5490
+ return;
5491
+ }
5492
+ current = current[part];
5493
+ }
5494
+ return current;
5495
+ };
5496
+ var withData = (config) => {
5497
+ return (component2) => {
5498
+ const state = createInitialState(config);
5499
+ if (config.data && component2.fields) {
5500
+ setFieldsData(component2.fields, config.data, true);
5501
+ state.currentData = collectFieldData(component2.fields);
5502
+ state.initialData = { ...state.currentData };
5503
+ }
5504
+ if (component2.on) {
5505
+ component2.on("field:change", (event) => {
5506
+ state.currentData[event.name] = event.value;
5507
+ const wasModified = state.modified;
5508
+ state.modified = hasDataChanged(state.initialData, state.currentData);
5509
+ if (wasModified !== state.modified) {
5510
+ component2.emit?.(FORM_EVENTS.STATE_CHANGE, {
5511
+ modified: state.modified,
5512
+ state: state.modified ? DATA_STATE.DIRTY : DATA_STATE.PRISTINE,
5513
+ name: event.name,
5514
+ value: event.value
5515
+ });
5516
+ }
5517
+ });
5518
+ }
5519
+ const enhanced = {
5520
+ ...component2,
5521
+ state,
5522
+ getData() {
5523
+ const data = collectFieldData(component2.fields);
5524
+ state.currentData = data;
5525
+ component2.emit?.(FORM_EVENTS.DATA_GET, data);
5526
+ return data;
5527
+ },
5528
+ setData(data, silent = false) {
5529
+ setFieldsData(component2.fields, data, silent);
5530
+ state.currentData = collectFieldData(component2.fields);
5531
+ if (silent) {
5532
+ state.initialData = { ...state.currentData };
5533
+ state.modified = false;
5534
+ syncTrackedFieldValues(component2.fields);
5535
+ } else {
5536
+ component2.emit?.(FORM_EVENTS.DATA_SET, state.currentData);
5537
+ }
5538
+ },
5539
+ getFieldValue(name) {
5540
+ const field = component2.fields.get(name);
5541
+ if (field) {
5542
+ return getFieldValue(field);
5543
+ }
5544
+ return state.currentData[name];
5545
+ },
5546
+ setFieldValue(name, value, silent = false) {
5547
+ const field = component2.fields.get(name);
5548
+ if (field) {
5549
+ setFieldValue(field, value, silent);
5550
+ state.currentData[name] = value;
5551
+ state.modified = hasDataChanged(state.initialData, state.currentData);
5552
+ if (!silent) {
5553
+ component2.emit?.(FORM_EVENTS.FIELD_CHANGE, { name, value });
5554
+ component2.emit?.(FORM_EVENTS.CHANGE, { name, value });
5555
+ }
5556
+ }
5557
+ },
5558
+ isModified() {
5559
+ const currentData = collectFieldData(component2.fields);
5560
+ state.modified = hasDataChanged(state.initialData, currentData);
5561
+ return state.modified;
5562
+ },
5563
+ getModifiedData() {
5564
+ const currentData = collectFieldData(component2.fields);
5565
+ return getModifiedFields(state.initialData, currentData);
5566
+ },
5567
+ snapshot() {
5568
+ state.initialData = { ...collectFieldData(component2.fields) };
5569
+ state.currentData = { ...state.initialData };
5570
+ state.modified = false;
5571
+ },
5572
+ reset() {
5573
+ setFieldsData(component2.fields, state.initialData, true);
5574
+ state.currentData = { ...state.initialData };
5575
+ state.modified = false;
5576
+ state.errors = {};
5577
+ component2.emit?.(FORM_EVENTS.RESET);
5578
+ },
5579
+ clear() {
5580
+ const emptyData = {};
5581
+ for (const name of component2.fields.keys()) {
5582
+ emptyData[name] = null;
5583
+ }
5584
+ setFieldsData(component2.fields, emptyData, true);
5585
+ state.currentData = {};
5586
+ state.modified = hasDataChanged(state.initialData, state.currentData);
5587
+ component2.emit?.(FORM_EVENTS.RESET);
5588
+ }
5589
+ };
5590
+ return enhanced;
5591
+ };
5592
+ };
5593
+ // src/components/form/features/controller.ts
5594
+ var updateStateClass = (element, modified, prefix, componentName) => {
5595
+ const modifiedClass = `${prefix}-${componentName}--${FORM_CLASSES.MODIFIED}`;
5596
+ element.classList.toggle(modifiedClass, modified);
5597
+ };
5598
+ var setFieldsEnabled = (fields, enabled) => {
5599
+ for (const [, field] of fields) {
5600
+ if (enabled && typeof field.enable === "function") {
5601
+ field.enable();
5602
+ } else if (!enabled && typeof field.disable === "function") {
5603
+ field.disable();
5604
+ }
5605
+ }
5606
+ };
5607
+ var getControlButtons = (ui, controlNames) => {
5608
+ const controls = new Map;
5609
+ for (const name of controlNames) {
5610
+ const control = ui[name];
5611
+ if (control && typeof control === "object" && "element" in control) {
5612
+ controls.set(name, control);
5613
+ }
5614
+ }
5615
+ return controls;
5616
+ };
5617
+ var setControlsEnabled = (controls, enabled) => {
5618
+ for (const [, control] of controls) {
5619
+ if (enabled && typeof control.enable === "function") {
5620
+ control.enable();
5621
+ } else if (!enabled && typeof control.disable === "function") {
5622
+ control.disable();
5623
+ }
5624
+ }
5625
+ };
5626
+ var withController = (config) => {
5627
+ return (component2) => {
5628
+ const prefix = config.prefix || FORM_DEFAULTS.prefix;
5629
+ const componentName = config.componentName || FORM_DEFAULTS.componentName;
5630
+ const controlNames = config.controls ? [...config.controls] : [...FORM_DEFAULTS.controls];
5631
+ const controls = controlNames ? getControlButtons(component2.ui || {}, controlNames) : new Map;
5632
+ if (controls.size > 0) {
5633
+ setControlsEnabled(controls, false);
5634
+ }
5635
+ const enhanced = {
5636
+ ...component2,
5637
+ controls,
5638
+ getDataState() {
5639
+ return component2.state.modified ? DATA_STATE.DIRTY : DATA_STATE.PRISTINE;
5640
+ },
5641
+ enableControls() {
5642
+ setControlsEnabled(controls, true);
5643
+ },
5644
+ disableControls() {
5645
+ setControlsEnabled(controls, false);
5646
+ },
5647
+ enableFields() {
5648
+ setFieldsEnabled(component2.fields, true);
5649
+ component2.state.disabled = false;
5650
+ },
5651
+ disableFields() {
5652
+ setFieldsEnabled(component2.fields, false);
5653
+ component2.state.disabled = true;
5654
+ }
5655
+ };
5656
+ if (config.useChanges !== false && component2.on) {
5657
+ component2.on(FORM_EVENTS.STATE_CHANGE, (event) => {
5658
+ if (event.modified) {
5659
+ setControlsEnabled(controls, true);
5660
+ } else {
5661
+ setControlsEnabled(controls, false);
5662
+ }
5663
+ if (component2.element) {
5664
+ updateStateClass(component2.element, event.modified, prefix, componentName);
5665
+ }
5666
+ });
5667
+ }
5668
+ return enhanced;
5669
+ };
5670
+ };
5671
+ // src/components/form/features/submit.ts
5672
+ var DEFAULT_HEADERS = {
5673
+ Accept: "application/json",
5674
+ "Content-Type": "application/json"
5675
+ };
5676
+ var validateData = (data, rules) => {
5677
+ const errors = {};
5678
+ let valid = true;
5679
+ for (const rule of rules) {
5680
+ const value = data[rule.field];
5681
+ const result = rule.validate(value, data);
5682
+ if (result === false) {
5683
+ valid = false;
5684
+ errors[rule.field] = rule.message || `${rule.field} is invalid`;
5685
+ } else if (typeof result === "string") {
5686
+ valid = false;
5687
+ errors[rule.field] = result;
5688
+ }
5689
+ }
5690
+ return { valid, errors };
5691
+ };
5692
+ var performRequest = async (url, data, options) => {
5693
+ const method = options.method || "POST";
5694
+ const headers = { ...DEFAULT_HEADERS, ...options.headers };
5695
+ const fetchOptions = {
5696
+ method,
5697
+ headers
5698
+ };
5699
+ if (method !== "GET") {
5700
+ fetchOptions.body = JSON.stringify(data);
5701
+ }
5702
+ const response = await fetch(url, fetchOptions);
5703
+ const contentType = response.headers.get("content-type");
5704
+ let result;
5705
+ if (contentType && contentType.includes("application/json")) {
5706
+ result = await response.json();
5707
+ } else {
5708
+ result = await response.text();
5709
+ }
5710
+ if (!response.ok) {
5711
+ const error = new Error(`HTTP ${response.status}: ${response.statusText}`);
5712
+ error.response = result;
5713
+ throw error;
5714
+ }
5715
+ return result;
5716
+ };
5717
+ var withSubmit = (config) => {
5718
+ return (component2) => {
5719
+ let validationRules = config.validation || [];
5720
+ const enhanced = {
5721
+ ...component2,
5722
+ validate() {
5723
+ const data = component2.getData();
5724
+ const result = validateData(data, validationRules);
5725
+ component2.state.errors = result.errors;
5726
+ if (!result.valid) {
5727
+ component2.emit?.(FORM_EVENTS.VALIDATION_ERROR, result.errors);
5728
+ }
5729
+ return result;
5730
+ },
5731
+ async submit(options = {}) {
5732
+ if (component2.state.submitting) {
5733
+ return Promise.reject(new Error("Form is already submitting"));
5734
+ }
5735
+ if (options.validate !== false && validationRules.length > 0) {
5736
+ const validation = this.validate();
5737
+ if (!validation.valid) {
5738
+ return Promise.reject(new Error("Validation failed"));
5739
+ }
5740
+ }
5741
+ component2.state.submitting = true;
5742
+ if (component2.element) {
5743
+ const prefix = config.prefix || "mtrl";
5744
+ const componentName = config.componentName || "form";
5745
+ component2.element.classList.add(`${prefix}-${componentName}--${FORM_CLASSES.SUBMITTING}`);
5746
+ }
5747
+ const data = component2.getData();
5748
+ component2.emit?.(FORM_EVENTS.SUBMIT, data);
5749
+ try {
5750
+ let result;
5751
+ if (options.handler) {
5752
+ result = await options.handler(data, component2);
5753
+ } else if (config.action) {
5754
+ result = await performRequest(config.action, data, {
5755
+ method: options.method || config.method || "POST",
5756
+ headers: options.headers
5757
+ });
5758
+ } else {
5759
+ result = data;
5760
+ }
5761
+ component2.state.submitting = false;
5762
+ component2.state.errors = {};
5763
+ if (component2.element) {
5764
+ const prefix = config.prefix || "mtrl";
5765
+ const componentName = config.componentName || "form";
5766
+ component2.element.classList.remove(`${prefix}-${componentName}--${FORM_CLASSES.SUBMITTING}`);
5767
+ }
5768
+ component2.snapshot();
5769
+ component2.disableControls();
5770
+ component2.emit?.(FORM_EVENTS.SUBMIT_SUCCESS, result);
5771
+ return result;
5772
+ } catch (error) {
5773
+ component2.state.submitting = false;
5774
+ if (component2.element) {
5775
+ const prefix = config.prefix || "mtrl";
5776
+ const componentName = config.componentName || "form";
5777
+ component2.element.classList.remove(`${prefix}-${componentName}--${FORM_CLASSES.SUBMITTING}`);
5778
+ }
5779
+ component2.emit?.(FORM_EVENTS.SUBMIT_ERROR, error);
5780
+ throw error;
5781
+ }
5782
+ },
5783
+ setValidationRules(rules) {
5784
+ validationRules = rules;
5785
+ },
5786
+ clearErrors() {
5787
+ component2.state.errors = {};
5788
+ },
5789
+ setFieldError(field, error) {
5790
+ component2.state.errors[field] = error;
5791
+ },
5792
+ getFieldError(field) {
5793
+ return component2.state.errors[field];
5794
+ }
5795
+ };
5796
+ return enhanced;
5797
+ };
5798
+ };
5799
+ // src/components/form/features/api.ts
5800
+ var wireControlButtons = (controls, api, config) => {
5801
+ const submitButton = controls.get("submit");
5802
+ if (submitButton?.element) {
5803
+ submitButton.element.addEventListener("click", async () => {
5804
+ if (config.onSubmit) {
5805
+ try {
5806
+ const data = api.getData();
5807
+ await config.onSubmit(data, api);
5808
+ api.disableControls();
5809
+ } catch (error) {
5810
+ console.error("Form submit error:", error);
5811
+ api.disableControls();
5812
+ }
5813
+ } else {
5814
+ await api.submit();
5815
+ }
5816
+ });
5817
+ }
5818
+ const cancelButton = controls.get("cancel");
5819
+ if (cancelButton?.element) {
5820
+ cancelButton.element.addEventListener("click", () => {
5821
+ if (config.onCancel) {
5822
+ config.onCancel(api);
5823
+ } else {
5824
+ api.reset();
5825
+ }
5826
+ api.disableControls();
5827
+ });
5828
+ }
5829
+ };
5830
+ var withAPI2 = (config) => {
5831
+ return (component2) => {
5832
+ if (config.on && component2.on) {
5833
+ for (const [event, handler] of Object.entries(config.on)) {
5834
+ if (typeof handler === "function") {
5835
+ component2.on(event, handler);
5836
+ }
5837
+ }
5838
+ }
5839
+ const api = {
5840
+ element: component2.element,
5841
+ form: component2.form,
5842
+ ui: component2.ui,
5843
+ fields: component2.fields,
5844
+ state: component2.state,
5845
+ getData() {
5846
+ return component2.getData();
5847
+ },
5848
+ setData(data, silent) {
5849
+ component2.setData(data, silent);
5850
+ return api;
5851
+ },
5852
+ getFieldValue(name) {
5853
+ return component2.getFieldValue(name);
5854
+ },
5855
+ setFieldValue(name, value, silent) {
5856
+ component2.setFieldValue(name, value, silent);
5857
+ return api;
5858
+ },
5859
+ getField(name) {
5860
+ return component2.getField(name);
5861
+ },
5862
+ getFieldNames() {
5863
+ return component2.getFieldNames();
5864
+ },
5865
+ isModified() {
5866
+ return component2.isModified();
5867
+ },
5868
+ getDataState() {
5869
+ return component2.getDataState();
5870
+ },
5871
+ validate() {
5872
+ return component2.validate();
5873
+ },
5874
+ async submit(options) {
5875
+ return component2.submit(options);
5876
+ },
5877
+ reset() {
5878
+ component2.reset();
5879
+ return api;
5880
+ },
5881
+ clear() {
5882
+ component2.clear();
5883
+ return api;
5884
+ },
5885
+ enable() {
5886
+ component2.enableFields();
5887
+ return api;
5888
+ },
5889
+ disable() {
5890
+ component2.disableFields();
5891
+ return api;
5892
+ },
5893
+ enableControls() {
5894
+ component2.enableControls();
5895
+ return api;
5896
+ },
5897
+ disableControls() {
5898
+ component2.disableControls();
5899
+ return api;
5900
+ },
5901
+ on(event, handler) {
5902
+ component2.on?.(event, handler);
5903
+ return api;
5904
+ },
5905
+ off(event, handler) {
5906
+ component2.off?.(event, handler);
5907
+ return api;
5908
+ },
5909
+ emit(event, data) {
5910
+ component2.emit?.(event, data);
5911
+ },
5912
+ destroy() {
5913
+ for (const [, field] of component2.fields) {
5914
+ if (typeof field.destroy === "function") {
5915
+ field.destroy();
5916
+ }
5917
+ }
5918
+ for (const [, control] of component2.controls) {
5919
+ if (typeof control.destroy === "function") {
5920
+ control.destroy();
5921
+ }
5922
+ }
5923
+ if (component2.lifecycle?.destroy) {
5924
+ component2.lifecycle.destroy();
5925
+ }
5926
+ if (component2.element?.parentNode) {
5927
+ component2.element.parentNode.removeChild(component2.element);
5928
+ }
5929
+ component2.emit?.(FORM_EVENTS.RESET);
5930
+ }
5931
+ };
5932
+ wireControlButtons(component2.controls, api, config);
5933
+ return api;
5934
+ };
5935
+ };
5936
+ // src/components/form/form.ts
5937
+ var createForm = (config = {}) => {
5938
+ try {
5939
+ const baseConfig = createBaseConfig(config);
5940
+ const component2 = import_mtrl13.pipe(import_mtrl14.createBase, import_mtrl15.withEvents(), import_mtrl14.withElement(getElementConfig(baseConfig)), withLayout(baseConfig), withFields(baseConfig), withData(baseConfig), withController(baseConfig), withSubmit(baseConfig), import_mtrl15.withLifecycle(), withAPI2(baseConfig))(baseConfig);
5941
+ if (config.container && component2.element) {
5942
+ config.container.appendChild(component2.element);
5943
+ }
5944
+ return component2;
5945
+ } catch (error) {
5946
+ console.error("Form creation error:", error);
5947
+ throw new Error(`Failed to create form: ${error.message}`);
5948
+ }
5949
+ };
5950
+
5951
+ //# debugId=08BE9F41B186147D64756E2164756E21
5952
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3V0aWxzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IEdlc3R1cmVFdmVudCwgR2VzdHVyZVN0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIERpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2UoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coeDIgLSB4MSwgMikgKyBNYXRoLnBvdyh5MiAtIHkxLCAyKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGFuZ2xlIGJldHdlZW4gdHdvIHBvaW50cyBpbiBkZWdyZWVzICgwLTM2MClcbiAqXG4gKiBAcGFyYW0geDEgLSBYIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB5MSAtIFkgY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHgyIC0gWCBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHBhcmFtIHkyIC0gWSBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludFxuICogQHJldHVybnMgQW5nbGUgaW4gZGVncmVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5nbGUoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGFuZ2xlID0gKE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSkgKiAxODApIC8gTWF0aC5QSTtcbiAgcmV0dXJuIGFuZ2xlIDwgMCA/IGFuZ2xlICsgMzYwIDogYW5nbGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFzZSBnZXN0dXJlIGV2ZW50XG4gKlxuICogQHBhcmFtIHR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAqIEBwYXJhbSBvcmlnaW5hbEV2ZW50IC0gT3JpZ2luYWwgRE9NIGV2ZW50XG4gKiBAcGFyYW0gc3RhdGUgLSBDdXJyZW50IGdlc3R1cmUgc3RhdGVcbiAqIEByZXR1cm5zIEJhc2UgZ2VzdHVyZSBldmVudCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdlc3R1cmVFdmVudChcbiAgdHlwZTogc3RyaW5nLFxuICBvcmlnaW5hbEV2ZW50OiBFdmVudCxcbiAgc3RhdGU6IEdlc3R1cmVTdGF0ZVxuKTogR2VzdHVyZUV2ZW50IHtcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG5cbiAgY29uc3QgZXZlbnQ6IEdlc3R1cmVFdmVudCA9IHtcbiAgICB0eXBlLFxuICAgIG9yaWdpbmFsRXZlbnQsXG4gICAgdGFyZ2V0OlxuICAgICAgKHN0YXRlLnRhcmdldCBhcyBFdmVudFRhcmdldCkgfHwgKG9yaWdpbmFsRXZlbnQudGFyZ2V0IGFzIEV2ZW50VGFyZ2V0KSxcbiAgICBzdGFydFRpbWU6IHN0YXRlLnN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uOiBlbmRUaW1lIC0gc3RhdGUuc3RhcnRUaW1lLFxuICAgIGRlZmF1bHRQcmV2ZW50ZWQsXG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICBpZiAob3JpZ2luYWxFdmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgb3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0b3VjaCBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRvdWNoIGlzIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVG91Y2hTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhQb2ludHMgPSAobmF2aWdhdG9yIGFzIGFueSkubWF4VG91Y2hQb2ludHM7XG4gIHJldHVybiAoXG4gICAgXCJvbnRvdWNoc3RhcnRcIiBpbiB3aW5kb3cgfHwgKHR5cGVvZiBtYXhQb2ludHMgPT09IFwibnVtYmVyXCIgJiYgbWF4UG9pbnRzID4gMClcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgcG9pbnRlciBldmVudHMgYXJlIHN1cHBvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9pbnRlclN1cHBvcnQoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXdpbmRvdy5Qb2ludGVyRXZlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCBub3JtYWxpemVkIHRvdWNoIGNvb3JkaW5hdGVzIGZyb20gYW4gZXZlbnRcbiAqIFdvcmtzIHdpdGggbW91c2UgZXZlbnRzLCB0b3VjaCBldmVudHMgYW5kIHBvaW50ZXIgZXZlbnRzXG4gKlxuICogQHBhcmFtIGUgLSBET00gZXZlbnRcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNsaWVudFggYW5kIGNsaWVudFkgY29vcmRpbmF0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvdWNoQ29vcmRpbmF0ZXMoXG4gIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgUG9pbnRlckV2ZW50XG4pOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0ge1xuICBpZiAoXCJ0b3VjaGVzXCIgaW4gZSAmJiBBcnJheS5pc0FycmF5KGUudG91Y2hlcykgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50WDogZS50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBlLnRvdWNoZXNbMF0uY2xpZW50WSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbGllbnRYOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRYLFxuICAgIGNsaWVudFk6IChlIGFzIE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpLmNsaWVudFksXG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBUYXAgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCB0YXAgZ2VzdHVyZVxuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRhcCBldmVudCBvciBudWxsIGlmIG5vIHRhcCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0VGFwKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogVGFwRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBjdXJyZW50IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgaWYgKGRpc3RhbmNlIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCkge1xuICAgIC8vIENoZWNrIGZvciBkb3VibGUgdGFwXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpc0RvdWJsZVRhcCA9IG5vdyAtIHN0YXRlLmxhc3RUYXBUaW1lIDwgMzAwO1xuICAgIFxuICAgIGNvbnN0IHRhcENvdW50ID0gaXNEb3VibGVUYXAgPyBzdGF0ZS50YXBDb3VudCArIDEgOiAxO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0YXAgZXZlbnRcbiAgICBjb25zdCB0YXBFdmVudDogVGFwRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3RhcCcsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6ICd0YXAnLFxuICAgICAgY291bnQ6IHRhcENvdW50LFxuICAgICAgeDogc3RhdGUuY3VycmVudFgsXG4gICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHRhcEV2ZW50O1xuICB9XG4gIFxuICByZXR1cm4gbnVsbDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFN3aXBlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgU3dpcGVFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsIFNXSVBFX0RJUkVDVElPTlMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICogXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKTogU1dJUEVfRElSRUNUSU9OUyB7XG4gIGlmIChNYXRoLmFicyhkZWx0YVgpID4gTWF0aC5hYnMoZGVsdGFZKSkge1xuICAgIHJldHVybiBkZWx0YVggPiAwID8gU1dJUEVfRElSRUNUSU9OUy5SSUdIVCA6IFNXSVBFX0RJUkVDVElPTlMuTEVGVDtcbiAgfVxuICByZXR1cm4gZGVsdGFZID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuRE9XTiA6IFNXSVBFX0RJUkVDVElPTlMuVVA7XG59XG5cbi8qKlxuICogRGV0ZWN0IHN3aXBlIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBTd2lwZSBldmVudCBvciBudWxsIGlmIG5vIHN3aXBlIGRldGVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RTd2lwZShjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFN3aXBlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucywgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcbiAgXG4gIC8vIENhbGN1bGF0ZSBkZWx0YXMgYW5kIGRpc3RhbmNlXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgXG4gIC8vIENhbGN1bGF0ZSB0aW1lIGFuZCB2ZWxvY2l0eVxuICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZGVsdGFUaW1lID0gZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZTtcbiAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGRlbHRhVGltZTtcbiAgXG4gIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICBpZiAoZGlzdGFuY2UgPj0gb3B0aW9ucy5zd2lwZVRocmVzaG9sZCAmJiBkZWx0YVRpbWUgPD0gb3B0aW9ucy5zd2lwZVRpbWVUaHJlc2hvbGQpIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHN3aXBlIGV2ZW50XG4gICAgY29uc3Qgc3dpcGVFdmVudDogU3dpcGVFdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnc3dpcGUnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAnc3dpcGUnLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICB2ZWxvY2l0eSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBlbmRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGVuZFk6IHN0YXRlLmN1cnJlbnRZXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gc3dpcGVFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gTG9uZyBwcmVzcyBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogRGV0ZWN0IGxvbmcgcHJlc3MgZ2VzdHVyZVxuICogXG4gKiBUaGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIG90aGVyIGdlc3R1cmUgZGV0ZWN0b3JzIGFzIGl0IHNldHMgdXAgYSB0aW1lclxuICogYW5kIHJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHRpbWVyIGNvbXBsZXRlcy5cbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbG9uZyBwcmVzcyBpcyBkZXRlY3RlZFxuICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RMb25nUHJlc3MoXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBjYWxsYmFjazogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBTZXQgYSB0aW1lciBmb3IgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gT25seSB0cmlnZ2VyIGlmIGdlc3R1cmUgaXMgc3RpbGwgYWN0aXZlXG4gICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGlmZlggPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WCk7XG4gICAgICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgICAgIFxuICAgICAgaWYgKGRpZmZYIDwgb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZCAmJiBkaWZmWSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGxvbmcgcHJlc3MgZXZlbnRcbiAgICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudCgnbG9uZ3ByZXNzJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgICAgIHR5cGU6ICdsb25ncHJlc3MnLFxuICAgICAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgICAgIHk6IHN0YXRlLmN1cnJlbnRZXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBUcmlnZ2VyIGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIG9wdGlvbnMubG9uZ1ByZXNzVGltZSk7XG4gIFxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH07XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgbW92ZW1lbnQgd291bGQgY2FuY2VsIGEgbG9uZyBwcmVzc1xuICogXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxvbmcgcHJlc3Mgc2hvdWxkIGJlIGNhbmNlbGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRDYW5jZWxMb25nUHJlc3MoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBib29sZWFuIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgXG4gIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICBjb25zdCBkaWZmWSA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZKTtcbiAgXG4gIHJldHVybiBkaWZmWCA+IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgfHwgZGlmZlkgPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBhbiBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwYW4gZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgUGFuIGV2ZW50IG9yIG51bGwgaWYgbm8gc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBhbihjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFBhbkV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGRlbHRhIGZyb20gc3RhcnQgcG9zaXRpb25cbiAgY29uc3QgZGVsdGFYID0gc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFg7XG4gIGNvbnN0IGRlbHRhWSA9IHN0YXRlLmN1cnJlbnRZIC0gc3RhdGUuc3RhcnRZO1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIGxhc3QgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlJ3Mgc2lnbmlmaWNhbnQgbW92ZW1lbnRcbiAgY29uc3QgbW92ZURlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUubGFzdFg7XG4gIGNvbnN0IG1vdmVEZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLmxhc3RZO1xuICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICApO1xuXG4gIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHNpZ25pZmljYW50XG4gIGlmIChtb3ZlRGVsdGEgPiAwKSB7XG4gICAgLy8gQ3JlYXRlIHBhbiBldmVudFxuICAgIGNvbnN0IHBhbkV2ZW50OiBQYW5FdmVudCA9IHtcbiAgICAgIC4uLmNyZWF0ZUdlc3R1cmVFdmVudChcInBhblwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBhblwiLFxuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgc3RhcnRYOiBzdGF0ZS5zdGFydFgsXG4gICAgICBzdGFydFk6IHN0YXRlLnN0YXJ0WSxcbiAgICAgIGN1cnJlbnRYOiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgIGN1cnJlbnRZOiBzdGF0ZS5jdXJyZW50WSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhbkV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3BpbmNoLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFBpbmNoIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUGluY2hFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50LCBnZXREaXN0YW5jZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGV0ZWN0IHBpbmNoIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUGluY2ggZXZlbnQgb3IgbnVsbCBpZiBubyBwaW5jaCBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0UGluY2goXG4gIGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICB0b3VjaDE6IFRvdWNoLFxuICB0b3VjaDI6IFRvdWNoXG4pOiBQaW5jaEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIG1vdmVtZW50IHRocmVzaG9sZCBmb3IgcGluY2ggZGV0ZWN0aW9uXG4gIGNvbnN0IFBJTkNIX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBkaXN0YW5jZSBjaGFuZ2UgaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKGN1cnJlbnREaXN0YW5jZSAtIHN0YXRlLnN0YXJ0RGlzdGFuY2UpID4gUElOQ0hfVEhSRVNIT0xEKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHNjYWxlIGZhY3RvclxuICAgIGNvbnN0IHNjYWxlID0gY3VycmVudERpc3RhbmNlIC8gc3RhdGUuc3RhcnREaXN0YW5jZTtcblxuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSBwaW5jaCBldmVudFxuICAgIGNvbnN0IHBpbmNoRXZlbnQ6IFBpbmNoRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwaW5jaFwiLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiBcInBpbmNoXCIsXG4gICAgICBzY2FsZSxcbiAgICAgIGNlbnRlclgsXG4gICAgICBjZW50ZXJZLFxuICAgIH07XG5cbiAgICByZXR1cm4gcGluY2hFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9yb3RhdGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gUm90YXRlIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUm90YXRlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0QW5nbGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCByb3RhdGUgZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIHRvdWNoMSAtIEZpcnN0IHRvdWNoIHBvaW50XG4gKiBAcGFyYW0gdG91Y2gyIC0gU2Vjb25kIHRvdWNoIHBvaW50XG4gKiBAcmV0dXJucyBSb3RhdGUgZXZlbnQgb3IgbnVsbCBpZiBubyByb3RhdGlvbiBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Um90YXRlKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUm90YXRlRXZlbnQgfCBudWxsIHtcbiAgY29uc3QgeyBzdGF0ZSwgb3JpZ2luYWxFdmVudCB9ID0gY29udGV4dDtcblxuICAvLyBDYWxjdWxhdGUgY3VycmVudCBhbmdsZSBiZXR3ZWVuIHRvdWNoIHBvaW50c1xuICBjb25zdCBjdXJyZW50QW5nbGUgPSBnZXRBbmdsZShcbiAgICB0b3VjaDEuY2xpZW50WCxcbiAgICB0b3VjaDEuY2xpZW50WSxcbiAgICB0b3VjaDIuY2xpZW50WCxcbiAgICB0b3VjaDIuY2xpZW50WVxuICApO1xuXG4gIC8vIE1pbmltdW0gcm90YXRpb24gdGhyZXNob2xkIGZvciBkZXRlY3Rpb25cbiAgY29uc3QgUk9UQVRJT05fVEhSRVNIT0xEID0gMTA7XG5cbiAgLy8gQ2FsY3VsYXRlIHJvdGF0aW9uIGRpZmZlcmVuY2VcbiAgY29uc3Qgcm90YXRpb25EaWZmID0gY3VycmVudEFuZ2xlIC0gc3RhdGUuc3RhcnRBbmdsZTtcblxuICAvLyBDaGVjayBpZiByb3RhdGlvbiBpcyBzaWduaWZpY2FudFxuICBpZiAoTWF0aC5hYnMocm90YXRpb25EaWZmKSA+IFJPVEFUSU9OX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJYID0gKHRvdWNoMS5jbGllbnRYICsgdG91Y2gyLmNsaWVudFgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRvdWNoMS5jbGllbnRZICsgdG91Y2gyLmNsaWVudFkpIC8gMjtcblxuICAgIC8vIENyZWF0ZSByb3RhdGUgZXZlbnRcbiAgICBjb25zdCByb3RhdGVFdmVudDogUm90YXRlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJyb3RhdGVcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJyb3RhdGVcIixcbiAgICAgIHJvdGF0aW9uOiByb3RhdGlvbkRpZmYsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJvdGF0ZUV2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gR2VzdHVyZSBtYW5hZ2VtZW50IHN5c3RlbSBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICovXG5cbmltcG9ydCB7IFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZVN0YXRlLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIEFueUdlc3R1cmVFdmVudCxcbiAgR0VTVFVSRV9UWVBFUyxcbiAgU1dJUEVfRElSRUNUSU9OU1xufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgZGV0ZWN0VGFwIH0gZnJvbSAnLi90YXAnO1xuaW1wb3J0IHsgZGV0ZWN0U3dpcGUgfSBmcm9tICcuL3N3aXBlJztcbmltcG9ydCB7IGRldGVjdExvbmdQcmVzcywgc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzIH0gZnJvbSAnLi9sb25ncHJlc3MnO1xuaW1wb3J0IHsgZGV0ZWN0UGFuIH0gZnJvbSAnLi9wYW4nO1xuaW1wb3J0IHsgZGV0ZWN0UGluY2ggfSBmcm9tICcuL3BpbmNoJztcbmltcG9ydCB7IGRldGVjdFJvdGF0ZSB9IGZyb20gJy4vcm90YXRlJztcbmltcG9ydCB7IGhhc1RvdWNoU3VwcG9ydCwgaGFzUG9pbnRlclN1cHBvcnQsIGdldFRvdWNoQ29vcmRpbmF0ZXMgfSBmcm9tICcuL3V0aWxzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCBjb25zdGFudHNcbmV4cG9ydCB7IEdFU1RVUkVfVFlQRVMsIFNXSVBFX0RJUkVDVElPTlMgfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZ2VzdHVyZSBtYW5hZ2VyIGZvciBoYW5kbGluZyB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IC0gRE9NIGVsZW1lbnQgdG8gYXR0YWNoIGdlc3R1cmUgcmVjb2duaXRpb24gdG9cbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlR2VzdHVyZU1hbmFnZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBjb25maWc6IEdlc3R1cmVDb25maWcgPSB7fVxuKTogR2VzdHVyZU1hbmFnZXIgPT4ge1xuICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgY29uc3Qgb3B0aW9uczogUmVxdWlyZWQ8R2VzdHVyZUNvbmZpZz4gPSB7XG4gICAgc3dpcGVUaHJlc2hvbGQ6IDMwLFxuICAgIHN3aXBlVGltZVRocmVzaG9sZDogMzAwLFxuICAgIGxvbmdQcmVzc1RpbWU6IDUwMCxcbiAgICB0YXBEaXN0YW5jZVRocmVzaG9sZDogMTAsXG4gICAgcHJldmVudERlZmF1bHQ6IHRydWUsXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAuLi5jb25maWdcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgY29uc3QgaGFuZGxlcnM6IE1hcDxzdHJpbmcsIFNldDxHZXN0dXJlSGFuZGxlcj4+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gR2VzdHVyZSBzdGF0ZVxuICBjb25zdCBzdGF0ZTogR2VzdHVyZVN0YXRlID0ge1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgc3RhcnRUaW1lOiAwLFxuICAgIHN0YXJ0WDogMCxcbiAgICBzdGFydFk6IDAsXG4gICAgbGFzdFg6IDAsXG4gICAgbGFzdFk6IDAsXG4gICAgY3VycmVudFg6IDAsXG4gICAgY3VycmVudFk6IDAsXG4gICAgdG91Y2hDb3VudDogMCxcbiAgICBsb25nUHJlc3NUaW1lcjogbnVsbCxcbiAgICBzdGFydERpc3RhbmNlOiAwLFxuICAgIHN0YXJ0QW5nbGU6IDAsXG4gICAgbGFzdFRhcFRpbWU6IDAsXG4gICAgdGFwQ291bnQ6IDAsXG4gICAgdGFyZ2V0OiBudWxsXG4gIH07XG4gIFxuICAvLyBEZXRlY3QgZmVhdHVyZSBzdXBwb3J0XG4gIGNvbnN0IHN1cHBvcnRUb3VjaCA9IGhhc1RvdWNoU3VwcG9ydCgpO1xuICBjb25zdCBzdXBwb3J0UG9pbnRlciA9IGhhc1BvaW50ZXJTdXBwb3J0KCk7XG4gICAgXG4gIGNvbnN0IGdlc3R1cmVTdXBwb3J0ID0ge1xuICAgIHRhcDogdHJ1ZSxcbiAgICBzd2lwZTogdHJ1ZSxcbiAgICBzd2lwZWxlZnQ6IHRydWUsXG4gICAgc3dpcGVyaWdodDogdHJ1ZSxcbiAgICBzd2lwZXVwOiB0cnVlLFxuICAgIHN3aXBlZG93bjogdHJ1ZSxcbiAgICBsb25ncHJlc3M6IHRydWUsXG4gICAgcGFuOiB0cnVlLFxuICAgIHBpbmNoOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXIsXG4gICAgcm90YXRlOiBzdXBwb3J0VG91Y2ggfHwgc3VwcG9ydFBvaW50ZXJcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGdlc3R1cmUgZXZlbnRcbiAgICovXG4gIGNvbnN0IGRpc3BhdGNoR2VzdHVyZSA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gR2V0IGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50IHR5cGVcbiAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50LnR5cGUpO1xuICAgIGlmICghZXZlbnRIYW5kbGVycykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgZXZlbnRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBnZXN0dXJlIGhhbmRsZXIgZm9yICR7ZXZlbnQudHlwZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEZvciBzd2lwZSwgYWxzbyBkaXNwYXRjaCBkaXJlY3Rpb24tc3BlY2lmaWMgZXZlbnRzXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdzd2lwZScgJiYgJ2RpcmVjdGlvbicgaW4gZXZlbnQpIHtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbkV2ZW50ID0geyAuLi5ldmVudCwgdHlwZTogYHN3aXBlJHtldmVudC5kaXJlY3Rpb259YCBhcyBhbnkgfTtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShkaXJlY3Rpb25FdmVudCBhcyBhbnkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb25cbiAgICBpZiAob3B0aW9ucy5wcmV2ZW50RGVmYXVsdCAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG9wdGlvbnMuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGxvbmdwcmVzcyBjbGVhbnVwIGZ1bmN0aW9uXG4gIGxldCBsb25nUHJlc3NDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICovXG4gIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFN0b3JlIGdlc3R1cmUgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSB0cnVlO1xuICAgIHN0YXRlLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgc3RhdGUuc3RhcnRYID0gc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgc3RhdGUuc3RhcnRZID0gc3RhdGUubGFzdFkgPSBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgc3RhdGUudG91Y2hDb3VudCA9IHRvdWNoQ291bnQ7XG4gICAgc3RhdGUudGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzIGZvciBwaW5jaCBhbmQgcm90YXRlXG4gICAgICBzdGF0ZS5zdGFydERpc3RhbmNlID0gTWF0aC5zcXJ0KFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYLCAyKSArIFxuICAgICAgICBNYXRoLnBvdyh0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLCAyKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgc3RhdGUuc3RhcnRBbmdsZSA9IE1hdGguYXRhbjIoXG4gICAgICAgIHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFksXG4gICAgICAgIHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFhcbiAgICAgICkgKiAxODAgLyBNYXRoLlBJO1xuICAgICAgXG4gICAgICBpZiAoc3RhdGUuc3RhcnRBbmdsZSA8IDApIHN0YXRlLnN0YXJ0QW5nbGUgKz0gMzYwO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgIH1cbiAgICBcbiAgICBsb25nUHJlc3NDbGVhbnVwID0gZGV0ZWN0TG9uZ1ByZXNzKGNvbnRleHQsIChsb25nUHJlc3NFdmVudCkgPT4ge1xuICAgICAgZGlzcGF0Y2hHZXN0dXJlKGxvbmdQcmVzc0V2ZW50KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgKi9cbiAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdG91Y2ggPSBnZXRUb3VjaENvb3JkaW5hdGVzKGUpO1xuICAgIGNvbnN0IHRvdWNoQ291bnQgPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlcy5sZW5ndGggOiAxO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBzdGF0ZS5sYXN0WCA9IHN0YXRlLmN1cnJlbnRYO1xuICAgIHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFk7XG4gICAgc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLmN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGNhbmNlbCBsb25ncHJlc3NcbiAgICBpZiAoc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQpICYmIGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZXRlY3QgcGFuIGdlc3R1cmVcbiAgICBjb25zdCBwYW5FdmVudCA9IGRldGVjdFBhbihjb250ZXh0KTtcbiAgICBpZiAocGFuRXZlbnQpIHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShwYW5FdmVudCk7XG4gICAgfVxuICAgIFxuICAgIC8vIE11bHRpLXRvdWNoIGdlc3R1cmVzXG4gICAgaWYgKHRvdWNoQ291bnQgPT09IDIgJiYgJ3RvdWNoZXMnIGluIGUpIHtcbiAgICAgIGNvbnN0IHRvdWNoMSA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHRvdWNoMiA9IGUudG91Y2hlc1sxXTtcbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHBpbmNoXG4gICAgICBjb25zdCBwaW5jaEV2ZW50ID0gZGV0ZWN0UGluY2goY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHBpbmNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHBpbmNoRXZlbnQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEZXRlY3Qgcm90YXRlXG4gICAgICBjb25zdCByb3RhdGVFdmVudCA9IGRldGVjdFJvdGF0ZShjb250ZXh0LCB0b3VjaDEsIHRvdWNoMik7XG4gICAgICBpZiAocm90YXRlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHJvdGF0ZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgKi9cbiAgY29uc3QgaGFuZGxlRW5kID0gKGU6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFNldHVwIGNvbnRleHQgZm9yIGdlc3R1cmUgZGV0ZWN0aW9uXG4gICAgY29uc3QgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQgPSB7XG4gICAgICBzdGF0ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBlXG4gICAgfTtcbiAgICBcbiAgICAvLyBEZXRlY3QgdGFwXG4gICAgY29uc3QgdGFwRXZlbnQgPSBkZXRlY3RUYXAoY29udGV4dCk7XG4gICAgaWYgKHRhcEV2ZW50KSB7XG4gICAgICAvLyBVcGRhdGUgdGFwIGNvdW50IGZvciBuZXh0IHRhcFxuICAgICAgc3RhdGUubGFzdFRhcFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgc3RhdGUudGFwQ291bnQgPSB0YXBFdmVudC5jb3VudDtcbiAgICAgIFxuICAgICAgZGlzcGF0Y2hHZXN0dXJlKHRhcEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGV0ZWN0IHN3aXBlXG4gICAgICBjb25zdCBzd2lwZUV2ZW50ID0gZGV0ZWN0U3dpcGUoY29udGV4dCk7XG4gICAgICBpZiAoc3dpcGVFdmVudCkge1xuICAgICAgICBkaXNwYXRjaEdlc3R1cmUoc3dpcGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgKi9cbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIENhbmNlbCBsb25nIHByZXNzIGRldGVjdGlvblxuICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICBzdGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIC8vIEV2ZW50IGxpc3RlbmVyIHJlZmVyZW5jZXNcbiAgbGV0IGV2ZW50TGlzdGVuZXJzOiB7IFxuICAgIFtldmVudDogc3RyaW5nXTogRXZlbnRMaXN0ZW5lciBcbiAgfSA9IHt9O1xuICBcbiAgLyoqXG4gICAqIFNldCB1cCBldmVudCBsaXN0ZW5lcnMgYmFzZWQgb24gYXZhaWxhYmxlIEFQSXNcbiAgICovXG4gIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAvLyBVc2UgUG9pbnRlciBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgcG9pbnRlcmRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJ1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHBvaW50ZXJjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc3VwcG9ydFRvdWNoKSB7XG4gICAgICAvLyBVc2UgVG91Y2ggRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIE1vdXNlIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgeyBwYXNzaXZlOiAhb3B0aW9ucy5wcmV2ZW50RGVmYXVsdCB9KTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgKi9cbiAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhciBldmVudExpc3RlbmVycyBvYmplY3RcbiAgICBldmVudExpc3RlbmVycyA9IHt9O1xuICB9O1xuICBcbiAgLy8gSW5pdGlhbGl6ZSBldmVudCBsaXN0ZW5lcnNcbiAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICBcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyXG4gICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBsaXN0ZW4gZm9yXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcik6IEdlc3R1cmVNYW5hZ2VyIHtcbiAgICAgIGlmICghaGFuZGxlcnMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGV2ZW50VHlwZSwgbmV3IFNldCgpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSkhLmFkZChoYW5kbGVyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmVcbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIG9mZihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBjb25zdCBldmVudEhhbmRsZXJzID0gaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSk7XG4gICAgICBpZiAoZXZlbnRIYW5kbGVycykge1xuICAgICAgICBldmVudEhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChldmVudEhhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBoYW5kbGVycy5kZWxldGUoZXZlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICovXG4gICAgaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGdlc3R1cmVUeXBlIGluIGdlc3R1cmVTdXBwb3J0ICYmIGdlc3R1cmVTdXBwb3J0W2dlc3R1cmVUeXBlIGFzIGtleW9mIHR5cGVvZiBnZXN0dXJlU3VwcG9ydF07XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSBhZGRpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGVuYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBieSByZW1vdmluZyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgZGlzYWJsZSgpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnMgYW5kIHRpbWVyc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBDbGVhbiB1cCBsaXN0ZW5lcnNcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGhhbmRsZXIgcmVmZXJlbmNlc1xuICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG59OyIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXMgdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlQ29uZmlnLFxuICBHZXN0dXJlSGFuZGxlcixcbiAgQW55R2VzdHVyZUV2ZW50LFxufSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgZ2VzdHVyZXMgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzRmVhdHVyZUNvbmZpZyBleHRlbmRzIEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVHZXN0dXJlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgZ2VzdHVyZSBldmVudCBoYW5kbGVyc1xuICAgKi9cbiAgZ2VzdHVyZUhhbmRsZXJzPzogUmVjb3JkPHN0cmluZywgR2VzdHVyZUhhbmRsZXI+O1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlc3R1cmVzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAgICovXG4gIGdlc3R1cmVzOiBHZXN0dXJlTWFuYWdlcjtcblxuICAvKipcbiAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25HZXN0dXJlOiAoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZ2VzdHVyZSB0eXBlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAqL1xuICBpc0dlc3R1cmVTdXBwb3J0ZWQ6IChnZXN0dXJlVHlwZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZUdlc3R1cmVzOiAoKSA9PiBHZXN0dXJlc0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGNvbXByZWhlbnNpdmUgZ2VzdHVyZSBmZWF0dXJlIHRoYXQgYWRkcyBzdXBwb3J0IGZvciBhbGwgZ2VzdHVyZSB0eXBlcy5cbiAqIEZvciBtb3JlIGxpZ2h0d2VpZ2h0LCBzcGVjaWZpYyBnZXN0dXJlcywgdXNlIHRoZSBpbmRpdmlkdWFsIGdlc3R1cmUgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgZ2VzdHVyZSBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGdlc3R1cmUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aEdlc3R1cmVzKHtcbiAqICAgICBzd2lwZVRocmVzaG9sZDogNTAsXG4gKiAgICAgZ2VzdHVyZUhhbmRsZXJzOiB7XG4gKiAgICAgICAndGFwJzogKGUpID0+IGhhbmRsZVRhcChlKSxcbiAqICAgICAgICdzd2lwZWxlZnQnOiAoZSkgPT4gbmF2aWdhdGVGb3J3YXJkKGUpLFxuICogICAgICAgJ3N3aXBlcmlnaHQnOiAoZSkgPT4gbmF2aWdhdGVCYWNrKGUpXG4gKiAgICAgfVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoR2VzdHVyZXMgPVxuICAoY29uZmlnOiBHZXN0dXJlc0ZlYXR1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgR2VzdHVyZXNDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgR2VzdHVyZXNDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlR2VzdHVyZXMgPSB0cnVlLFxuICAgICAgZ2VzdHVyZUhhbmRsZXJzID0ge30sXG4gICAgICAuLi5nZXN0dXJlQ29uZmlnXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIENyZWF0ZSBnZXN0dXJlIG1hbmFnZXJcbiAgICBjb25zdCBnZXN0dXJlTWFuYWdlciA9IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyKFxuICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBnZXN0dXJlQ29uZmlnXG4gICAgKTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGdlc3R1cmUgaGFuZGxlcnNcbiAgICBPYmplY3QuZW50cmllcyhnZXN0dXJlSGFuZGxlcnMpLmZvckVhY2goKFtldmVudFR5cGUsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBnZXN0dXJlTWFuYWdlci5vbihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5hYmxlL2Rpc2FibGUgYmFzZWQgb24gY29uZmlnXG4gICAgaWYgKCFlbmFibGVHZXN0dXJlcykge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIENvbm5lY3Qgd2l0aCBleGlzdGluZyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgLy8gRm9yd2FyZCBnZXN0dXJlIGV2ZW50cyB0byB0aGUgY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtXG4gICAgICBjb25zdCBmb3J3YXJkR2VzdHVyZUV2ZW50cyA9IChldmVudDogQW55R2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGZvcndhcmRlciBmb3IgY29tbW9uIGdlc3R1cmUgdHlwZXNcbiAgICAgIFtcbiAgICAgICAgXCJ0YXBcIixcbiAgICAgICAgXCJzd2lwZVwiLFxuICAgICAgICBcInN3aXBlbGVmdFwiLFxuICAgICAgICBcInN3aXBlcmlnaHRcIixcbiAgICAgICAgXCJzd2lwZXVwXCIsXG4gICAgICAgIFwic3dpcGVkb3duXCIsXG4gICAgICAgIFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIFwicGluY2hcIixcbiAgICAgICAgXCJyb3RhdGVcIixcbiAgICAgICAgXCJwYW5cIixcbiAgICAgIF0uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5vbih0eXBlLCBmb3J3YXJkR2VzdHVyZUV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGdlc3R1cmVzOiBnZXN0dXJlTWFuYWdlcixcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSBldmVudFxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmR2VzdHVyZShldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub2ZmKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGdlc3R1cmUgaXMgc3VwcG9ydGVkXG4gICAgICAgKi9cbiAgICAgIGlzR2VzdHVyZVN1cHBvcnRlZChnZXN0dXJlVHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXN0dXJlTWFuYWdlci5pc1N1cHBvcnRlZChnZXN0dXJlVHlwZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlR2VzdHVyZXMoKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLmVuYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5kaXNhYmxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBUYXBFdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGFwIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogRGlzdGFuY2UgdGhyZXNob2xkIChpbiBwaXhlbHMpIGZvciB0YXAgcmVjb2duaXRpb25cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHRhcERpc3RhbmNlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgdGFwIGdlc3R1cmVcbiAgICovXG4gIG9uVGFwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRhcCByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uVGFwOiAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRhcCByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlVGFwOiAoKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gdGFwIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyB0YXAgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCB0YXAgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhUYXBHZXN0dXJlKHtcbiAqICAgICBvblRhcDogKGUpID0+IGNvbnNvbGUubG9nKCdUYXBwZWQgYXQnLCBlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFRhcEdlc3R1cmUgPVxuICAoY29uZmlnOiBUYXBHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFRhcEdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgdGFwIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFRhcEdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uVGFwLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogVGFwRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25UYXApIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvblRhcCBhcyAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgbGFzdFRhcFRpbWUgPSAwO1xuICAgIGxldCB0YXBDb3VudCA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIHRhcCBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFRhcCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgeDogbnVtYmVyLFxuICAgICAgeTogbnVtYmVyXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBsYXN0VGFwVGltZSA8IDMwMDtcblxuICAgICAgaWYgKGlzRG91YmxlVGFwKSB7XG4gICAgICAgIHRhcENvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXBDb3VudCA9IDE7XG4gICAgICB9XG5cbiAgICAgIGxhc3RUYXBUaW1lID0gbm93O1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHRhcCBldmVudFxuICAgICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInRhcFwiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBub3csXG4gICAgICAgIGR1cmF0aW9uOiBub3cgLSBzdGFydFRpbWUsXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyXG4gICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih0YXBFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHRhcCBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJ0YXBcIiwgdGFwRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXRhcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgdGFwRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPVxuICAgICAgICBcImNoYW5nZWRUb3VjaGVzXCIgaW4gZSAmJiBlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGUuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgICA6IChlIGFzIE1vdXNlRXZlbnQpO1xuXG4gICAgICBjb25zdCBlbmRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIGNvbnN0IGVuZFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgbW92ZWRcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgaXMgd2l0aGluIHRocmVzaG9sZFxuICAgICAgaWYgKGRpc3RhbmNlIDwgdGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgZGlzcGF0Y2hUYXAoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSB0YXAgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvZmZUYXAoaGFuZGxlcjogKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVRhcCgpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvc3dpcGUudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQge1xuICBTd2lwZUV2ZW50LFxuICBTV0lQRV9ESVJFQ1RJT05TLFxuICBHZXN0dXJlSGFuZGxlcixcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHN3aXBlIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIGRpc3RhbmNlIChpbiBwaXhlbHMpIHRvIHJlY29nbml6ZSBhIHN3aXBlXG4gICAqIEBkZWZhdWx0IDMwXG4gICAqL1xuICBzd2lwZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgaW4gd2hpY2ggYSBzd2lwZSBtdXN0IGJlIGNvbXBsZXRlZFxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIHN3aXBlVGltZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGFueSBzd2lwZSBkaXJlY3Rpb25cbiAgICovXG4gIG9uU3dpcGU/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGxlZnQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlTGVmdD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgcmlnaHQgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlUmlnaHQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHVwIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVVwPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBkb3duIHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZURvd24/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgc3dpcGUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dpcGVHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZUxlZnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHN3aXBlIGV2ZW50IGhhbmRsZXIgZm9yIGFueSBkaXJlY3Rpb25cbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxlZnQgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHJpZ2h0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlUmlnaHQ6IChcbiAgICBoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiB1cCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVVwOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGRvd24gc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVEb3duOiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHN3aXBlIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVTd2lwZTogKCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gYmFzZWQgb24gZGVsdGEgWCBhbmQgWVxuICpcbiAqIEBwYXJhbSBkZWx0YVggLSBEaXN0YW5jZSBtb3ZlZCBpbiBYIGRpcmVjdGlvblxuICogQHBhcmFtIGRlbHRhWSAtIERpc3RhbmNlIG1vdmVkIGluIFkgZGlyZWN0aW9uXG4gKiBAcmV0dXJucyBEaXJlY3Rpb24gb2YgdGhlIHN3aXBlXG4gKi9cbmZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIEFkZHMgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBsaWdodHdlaWdodCBhbHRlcm5hdGl2ZSB0byB0aGUgZnVsbCBnZXN0dXJlIHN5c3RlbSxcbiAqIGZvY3VzZWQgb25seSBvbiBzd2lwZSBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgc3dpcGUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBzd2lwZSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFkZCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoU3dpcGVHZXN0dXJlKHtcbiAqICAgICBvblN3aXBlTGVmdDogKCkgPT4gc2hvd05leHRQYWdlKCksXG4gKiAgICAgb25Td2lwZVJpZ2h0OiAoKSA9PiBzaG93UHJldmlvdXNQYWdlKClcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFN3aXBlR2VzdHVyZSA9XG4gIChjb25maWc6IFN3aXBlR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBTd2lwZUdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHN3aXBlVGhyZXNob2xkID0gMzAsXG4gICAgICBzd2lwZVRpbWVUaHJlc2hvbGQgPSAzMDAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblN3aXBlLFxuICAgICAgb25Td2lwZUxlZnQsXG4gICAgICBvblN3aXBlUmlnaHQsXG4gICAgICBvblN3aXBlVXAsXG4gICAgICBvblN3aXBlRG93bixcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IGRpcmVjdGlvblxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgc3dpcGU6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVsZWZ0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlcmlnaHQ6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGV1cDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZWRvd246IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblN3aXBlKSBoYW5kbGVycy5zd2lwZS5hZGQob25Td2lwZSBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlTGVmdClcbiAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5hZGQob25Td2lwZUxlZnQgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZVJpZ2h0KVxuICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQob25Td2lwZVJpZ2h0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVVcClcbiAgICAgIGhhbmRsZXJzLnN3aXBldXAuYWRkKG9uU3dpcGVVcCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlRG93bilcbiAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQob25Td2lwZURvd24gYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBzd2lwZSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVyc1xuICAgICAqL1xuICAgIGNvbnN0IGRpc3BhdGNoU3dpcGUgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIGVuZFg6IG51bWJlcixcbiAgICAgIGVuZFk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gZW5kWCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGVuZFkgLSBzdGFydFk7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGRpc3RhbmNlIC8gZHVyYXRpb247XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3dpcGUgZXZlbnRcbiAgICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwic3dpcGVcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICAgIHN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBkZWx0YVgsXG4gICAgICAgIGRlbHRhWSxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIHZlbG9jaXR5LFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IHRyaWdnZXIgZ2VuZXJpYyBzd2lwZSBoYW5kbGVyc1xuICAgICAgaGFuZGxlcnMuc3dpcGUuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoc3dpcGVFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHN3aXBlIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZW4gdHJpZ2dlciBkaXJlY3Rpb24tc3BlY2lmaWMgaGFuZGxlcnNcbiAgICAgIGNvbnN0IGRpcmVjdGlvbktleSA9IGBzd2lwZSR7ZGlyZWN0aW9ufWAgYXMga2V5b2YgdHlwZW9mIGhhbmRsZXJzO1xuICAgICAgaGFuZGxlcnNbZGlyZWN0aW9uS2V5XS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlcih7IC4uLnN3aXBlRXZlbnQsIHR5cGU6IGRpcmVjdGlvbktleSB9IGFzIFN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluICR7ZGlyZWN0aW9uS2V5fSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcInN3aXBlXCIsIHN3aXBlRXZlbnQpO1xuICAgICAgICBjb21wb25lbnQuZW1pdChkaXJlY3Rpb25LZXksIHN3aXBlRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIXN3aXBlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBzd2lwZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHN3aXBlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHN3aXBlXG4gICAgICBpZiAoZGlzdGFuY2UgPj0gc3dpcGVUaHJlc2hvbGQgJiYgZHVyYXRpb24gPD0gc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoU3dpcGUoZSwgZW5kWCwgZW5kWSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhoYW5kbGVycykuZm9yRWFjaCgoaGFuZGxlclNldCkgPT4gaGFuZGxlclNldC5jbGVhcigpKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLy8gQWRkIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb25Td2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVMZWZ0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlRG93bihoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVkb3duLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZTd2lwZShoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGUuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVJpZ2h0KGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXJpZ2h0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZVVwKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZXVwLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBkaXNhYmxlU3dpcGUoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL2xvbmdwcmVzcy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgTG9uZ1ByZXNzRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGxvbmcgcHJlc3MgZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaW1lIChpbiBtcykgdG8gcmVjb2duaXplIGEgbG9uZyBwcmVzc1xuICAgKiBAZGVmYXVsdCA1MDBcbiAgICovXG4gIGxvbmdQcmVzc1RpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgbW92ZW1lbnQgdGhhdCBjYW5jZWxzIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIG1vdmVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBsb25nIHByZXNzIGdlc3R1cmVcbiAgICovXG4gIG9uTG9uZ1ByZXNzPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmTG9uZ1ByZXNzOiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZFxuICApID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZUxvbmdQcmVzczogKCkgPT4gTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gbG9uZyBwcmVzcyBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgbG9uZyBwcmVzcyBzZXR0aW5nc1xuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIGxvbmcgcHJlc3MgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoTG9uZ1ByZXNzR2VzdHVyZSh7XG4gKiAgICAgbG9uZ1ByZXNzVGltZTogODAwLFxuICogICAgIG9uTG9uZ1ByZXNzOiAoZSkgPT4gc2hvd0NvbnRleHRNZW51KGUueCwgZS55KVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTG9uZ1ByZXNzR2VzdHVyZSA9XG4gIChjb25maWc6IExvbmdQcmVzc0dlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNhbm5vdCBhZGQgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIlxuICAgICAgKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbG9uZ1ByZXNzVGltZSA9IDUwMCxcbiAgICAgIG1vdmVUaHJlc2hvbGQgPSAxMCxcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZSxcbiAgICAgIG9uTG9uZ1ByZXNzLFxuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBjb25zdCBoYW5kbGVyczogU2V0PChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQ+ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBoYW5kbGVyIHByb3ZpZGVkLCBhZGQgaXRcbiAgICBpZiAob25Mb25nUHJlc3MpIHtcbiAgICAgIGhhbmRsZXJzLmFkZChvbkxvbmdQcmVzcyBhcyAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxvbmdQcmVzc1RpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgbG9uZyBwcmVzcyBldmVudCB0byBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaExvbmdQcmVzcyA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICBjb25zdCBsb25nUHJlc3NFdmVudDogTG9uZ1ByZXNzRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IFwibG9uZ3ByZXNzXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBsb25nUHJlc3NFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICB4OiBjdXJyZW50WCxcbiAgICAgICAgeTogY3VycmVudFksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIobG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBsb25nIHByZXNzIGhhbmRsZXI6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdChcImxvbmdwcmVzc1wiLCBsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHByZXZlbnREZWZhdWx0IGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChwcmV2ZW50RGVmYXVsdCAmJiAhbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBsb25nUHJlc3NFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgZXhpc3RpbmcgdGltZXJcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIGxvbmcgcHJlc3MgdGltZXJcbiAgICAgIGxvbmdQcmVzc1RpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbW92ZW1lbnQgd2FzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hMb25nUHJlc3MoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfSwgbG9uZ1ByZXNzVGltZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGV4Y2VlZHMgdGhyZXNob2xkXG4gICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50WCAtIHN0YXJ0WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgaWYgKGRpc3RhbmNlID4gbW92ZVRocmVzaG9sZCkge1xuICAgICAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBpZiBtb3ZlZCB0b28gbXVjaFxuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIGRpY3Rpb25hcnlcbiAgICBjb25zdCBldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgRXZlbnRMaXN0ZW5lcj4gPSB7XG4gICAgICBtb3VzZWRvd246IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2htb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGVuZDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiAhcHJldmVudERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVycyBpZiBpbml0aWFsbHkgZW5hYmxlZFxuICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbGlmZWN5Y2xlIGludGVncmF0aW9uXG4gICAgaWYgKGhhc0xpZmVjeWNsZShjb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3k7XG5cbiAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBoYW5kbGVycy5jbGVhcigpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9uTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmTG9uZ1ByZXNzKGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZW5hYmxlTG9uZ1ByZXNzKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGxvbmcgcHJlc3MgcmVjb2duaXRpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBhbnkgdGltZXJzXG4gICAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGxvbmdQcmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IFBhbkV2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwYW4gZ2VzdHVyZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIHN0YXJ0IChmaXJzdCBtb3ZlbWVudClcbiAgICovXG4gIG9uUGFuU3RhcnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcyBkdXJpbmcgcGFuKVxuICAgKi9cbiAgb25QYW4/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgcGFuIGVuZCAodG91Y2gvbW91c2UgcmVsZWFzZSlcbiAgICovXG4gIG9uUGFuRW5kPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHBhbiByZWNvZ25pdGlvbiBpbW1lZGlhdGVseVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogRXh0ZW5kIHRoZSBQYW5FdmVudCBpbnRlcmZhY2UgdG8gc3VwcG9ydCBvdXIgY3VzdG9tIGV2ZW50IHR5cGVzXG4gKi9cbmludGVyZmFjZSBFeHRlbmRlZFBhbkV2ZW50IGV4dGVuZHMgT21pdDxQYW5FdmVudCwgXCJ0eXBlXCI+IHtcbiAgdHlwZTogXCJwYW5cIiB8IFwicGFuc3RhcnRcIiB8IFwicGFuZW5kXCI7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIHN0YXJ0XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIG1vdmUgKGNvbnRpbnVvdXMgdXBkYXRlcylcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgcGFuIGVuZFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gc3RhcnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuU3RhcnQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gbW92ZSBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW46IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYW4gZW5kIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhbkVuZDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHBhbiByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlUGFuOiAoKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gcGFuIGRldGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyBwYW4gc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBwYW4gY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhQYW5HZXN0dXJlKHtcbiAqICAgICBvblBhblN0YXJ0OiAoZSkgPT4gc3RhcnREcmFnKGUpLFxuICogICAgIG9uUGFuOiAoZSkgPT4gdXBkYXRlRHJhZ1Bvc2l0aW9uKGUpLFxuICogICAgIG9uUGFuRW5kOiAoZSkgPT4gZW5kRHJhZyhlKVxuICogICB9KVxuICogKShjb25maWcpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoUGFuR2VzdHVyZSA9XG4gIChjb25maWc6IFBhbkdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgUGFuR2VzdHVyZUNvbXBvbmVudCA9PiB7XG4gICAgaWYgKCFjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKFwiQ2Fubm90IGFkZCBwYW4gZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCIpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBDICYgUGFuR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblBhblN0YXJ0LFxuICAgICAgb25QYW4sXG4gICAgICBvblBhbkVuZCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlIGJ5IHBhbiBwaGFzZVxuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgcGFuc3RhcnQ6IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbjogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgcGFuZW5kOiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgfTtcblxuICAgIC8vIEFkZCBpbml0aWFsIGhhbmRsZXJzIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9uUGFuU3RhcnQpXG4gICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQob25QYW5TdGFydCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25QYW4pIGhhbmRsZXJzLnBhbi5hZGQob25QYW4gYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuRW5kKSBoYW5kbGVycy5wYW5lbmQuYWRkKG9uUGFuRW5kIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgbGFzdFggPSAwO1xuICAgIGxldCBsYXN0WSA9IDA7XG4gICAgbGV0IGN1cnJlbnRYID0gMDtcbiAgICBsZXQgY3VycmVudFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYW4gZXZlbnQgd2l0aCB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZVBhbkV2ZW50ID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICB0eXBlOiBcInBhbnN0YXJ0XCIgfCBcInBhblwiIHwgXCJwYW5lbmRcIlxuICAgICk6IEV4dGVuZGVkUGFuRXZlbnQgPT4ge1xuICAgICAgY29uc3QgZXZlbnQ6IEV4dGVuZGVkUGFuRXZlbnQgPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBkZWx0YVg6IGN1cnJlbnRYIC0gc3RhcnRYLFxuICAgICAgICBkZWx0YVk6IGN1cnJlbnRZIC0gc3RhcnRZLFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgY3VycmVudFgsXG4gICAgICAgIGN1cnJlbnRZLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBwYW4gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFBhbiA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGV4dGVuZGVkUGFuRXZlbnQgPSBjcmVhdGVQYW5FdmVudChlLCB0eXBlKTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXIgZm9yIHRoaXMgcGhhc2VcbiAgICAgIGhhbmRsZXJzW3R5cGVdLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUeXBlIGFzc2VydGlvbiBmb3IgdGhlIGhhbmRsZXIgY2FsbCAtIHdlJ3JlIGRlbGliZXJhdGVseSBwYXNzaW5nIG91ciBleHRlbmRlZCBldmVudFxuICAgICAgICAgIGhhbmRsZXIoZXh0ZW5kZWRQYW5FdmVudCBhcyB1bmtub3duIGFzIFBhbkV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke3R5cGV9IGhhbmRsZXI6YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KHR5cGUsIGV4dGVuZGVkUGFuRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWV4dGVuZGVkUGFuRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBleHRlbmRlZFBhbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSBsYXN0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGxhc3RZID0gY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgICBpc1Bhbm5pbmcgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVNb3ZlID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvblxuICAgICAgbGFzdFggPSBjdXJyZW50WDtcbiAgICAgIGxhc3RZID0gY3VycmVudFk7XG4gICAgICBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBtb3ZlbWVudCBkZWx0YVxuICAgICAgY29uc3QgbW92ZURlbHRhWCA9IGN1cnJlbnRYIC0gbGFzdFg7XG4gICAgICBjb25zdCBtb3ZlRGVsdGFZID0gY3VycmVudFkgLSBsYXN0WTtcbiAgICAgIGNvbnN0IG1vdmVEZWx0YSA9IE1hdGguc3FydChcbiAgICAgICAgbW92ZURlbHRhWCAqIG1vdmVEZWx0YVggKyBtb3ZlRGVsdGFZICogbW92ZURlbHRhWVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZWN0IHNpZ25pZmljYW50IG1vdmVtZW50XG4gICAgICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzaWduaWZpY2FudCBtb3ZlbWVudCwgdHJpZ2dlciBwYW5zdGFydFxuICAgICAgICBpZiAoIWlzUGFubmluZykge1xuICAgICAgICAgIGlzUGFubmluZyA9IHRydWU7XG4gICAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5zdGFydFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW4gdHJpZ2dlciB0aGUgY29udGludW91cyBwYW4gZXZlbnRcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5cIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2Ugd2VyZSBwYW5uaW5nLCB0cmlnZ2VyIHRoZSBwYW5lbmQgZXZlbnRcbiAgICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2hQYW4oZSwgXCJwYW5lbmRcIik7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25QYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuRW5kKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuZW5kLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW1vdmUgaGFuZGxlciBtZXRob2RzXG4gICAgICBvZmZQYW5TdGFydChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbnN0YXJ0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW4oaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW4uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9mZlBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgbWV0aG9kc1xuICAgICAgZW5hYmxlUGFuKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9zY2hlbWFcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzY2hlbWEgcHJvY2Vzc29yIHdpdGggaW50ZWdyYXRlZCBvcHRpbWl6YXRpb25zXG4gKiBDb25zb2xpZGF0ZXMgYXJyYXksIG9iamVjdCwgSlNYLCBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTIChFc3NlbnRpYWwgb25seSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xuICAvKiogQmFzZSBsYXlvdXQgdHlwZSAqL1xuICB0eXBlPzogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgc3RyaW5nO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzICovXG4gIGdhcD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBBbGlnbm1lbnQgb2YgaXRlbXMgYWxvbmcgdGhlIGNyb3NzIGF4aXMgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBtYWluIGF4aXMgKi9cbiAganVzdGlmeT86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiIHwgXCJiZXR3ZWVuXCIgfCBcImFyb3VuZFwiIHwgXCJldmVubHlcIjtcbiAgLyoqIFdoZXRoZXIgYW5kIGhvdyBpdGVtcyBzaG91bGQgd3JhcCAqL1xuICB3cmFwPzogYm9vbGVhbiB8IFwicmV2ZXJzZVwiIHwgXCJub3dyYXBcIjtcbiAgLyoqIFdoZXRoZXIgcm93IGl0ZW1zIHNob3VsZCBzdGFjayB2ZXJ0aWNhbGx5IG9uIG1vYmlsZSAqL1xuICBtb2JpbGVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc2Nyb2xsIGhvcml6b250YWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU2Nyb2xsPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjb2x1bW5zIG9yIGF1dG9tYXRpYyBzaXppbmcgbWV0aG9kICovXG4gIGNvbHVtbnM/OiBudW1iZXIgfCBcImF1dG8tZml0XCIgfCBcImF1dG8tZmlsbFwiO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVuc2UgcGFja2luZyBhbGdvcml0aG0gZm9yIGdyaWQgKi9cbiAgZGVuc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBncmlkIGl0ZW1zIHNob3VsZCBhZGp1c3QgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKi9cbiAgYXV0b0hlaWdodD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SXRlbUNvbmZpZyB7XG4gIC8qKiBDb2x1bW4gd2lkdGggaW4gYSAxMi1jb2x1bW4gZ3JpZCAqL1xuICB3aWR0aD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIHNtYWxsIHNjcmVlbnMgKi9cbiAgc20/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBtZWRpdW0gc2NyZWVucyAqL1xuICBtZD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIGxhcmdlIHNjcmVlbnMgKi9cbiAgbGc/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBleHRyYS1sYXJnZSBzY3JlZW5zICovXG4gIHhsPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgY29sdW1ucyB0byBzcGFuICovXG4gIHNwYW4/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgZ3JpZCByb3dzIHRvIHNwYW4gKi9cbiAgcm93U3Bhbj86IG51bWJlcjtcbiAgLyoqIERpc3BsYXkgb3JkZXIgKi9cbiAgb3JkZXI/OiBudW1iZXIgfCBcImZpcnN0XCIgfCBcImxhc3RcIjtcbiAgLyoqIFNlbGYtYWxpZ25tZW50IHdpdGhpbiBjb250YWluZXIgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogV2hldGhlciBpdGVtIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNpemUgKi9cbiAgYXV0bz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGNyZWF0b3IgZnVuY3Rpb24gdG8gdXNlIGlmIG5vdCBzcGVjaWZpZWQgaW4gc2NoZW1hICovXG4gIGNyZWF0b3I/OiBGdW5jdGlvbjtcbiAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgQ1NTIGNsYXNzIHByZWZpeCBAZGVmYXVsdCB0cnVlICovXG4gIHByZWZpeD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFJlc3VsdCB7XG4gIC8qKiBUaGUgcmF3IGxheW91dCBvYmplY3Qgd2l0aCBhbGwgY29tcG9uZW50cyAqL1xuICBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBmb3IgY29udmVuaWVuY2UgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBhbnk7XG4gIC8qKiBGbGF0dGVuZWQgY29tcG9uZW50IG1hcCAqL1xuICBjb21wb25lbnQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWUgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGFueTtcbiAgLyoqIEdldHMgYWxsIGNvbXBvbmVudHMgaW4gYSBmbGF0dGVuZWQgbWFwICovXG4gIGdldEFsbCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogRGVzdHJveXMgdGhlIGxheW91dCwgY2xlYW5pbmcgdXAgYWxsIGNvbXBvbmVudHMgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG50eXBlIENvbXBvbmVudExpa2UgPSB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbnR5cGUgU2NoZW1hSXRlbSA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IFNjaGVtYUl0ZW1bXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTFQtSU4gT1BUSU1JWkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZyYWdtZW50IFBvb2wgZm9yIGVmZmljaWVudCBEb2N1bWVudEZyYWdtZW50IHJldXNlXG4gKiBSZWR1Y2VzIEdDIHByZXNzdXJlIGluIGhpZ2gtZnJlcXVlbmN5IGxheW91dCBjcmVhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY2xhc3MgRnJhZ21lbnRQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBEb2N1bWVudEZyYWdtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhTaXplID0gODsgLy8gT3B0aW1pemVkIHNpemUgZm9yIG1lbW9yeSBlZmZpY2llbmN5XG5cbiAgZ2V0KCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiB0aGlzLnBvb2wucG9wKCkgfHwgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB9XG5cbiAgcmVsZWFzZShmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhTaXplICYmIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBvb2wucHVzaChmcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuY29uc3QgZnJhZ21lbnRQb29sID0gbmV3IEZyYWdtZW50UG9vbCgpO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgY2FjaGUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uc1xuICogUmVkdWNlcyBzdHJpbmcgb3BlcmF0aW9ucyBieSBjYWNoaW5nIGdlbmVyYXRlZCBjbGFzcyBuYW1lc1xuICovXG5jb25zdCBjbGFzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5jb25zdCBQUkVGSVhfV0lUSF9EQVNIID0gYCR7UFJFRklYfS1gO1xuXG4vKipcbiAqIEdldHMgYSBjYWNoZWQgY2xhc3MgbmFtZSBmb3IgbGF5b3V0IGNvbmZpZ3VyYXRpb25cbiAqIE9wdGltaXplZCBmb3IgZGlmZmVyZW50IGNsYXNzIG5hbWluZyBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRDbGFzc05hbWUoXG4gIHR5cGU6IHN0cmluZyxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IGAke3R5cGV9LSR7cHJvcGVydHl9LSR7dmFsdWV9YDtcbiAgaWYgKCFjbGFzc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiaXRlbVwiKSB7XG4gICAgICBjbGFzc0NhY2hlLnNldChcbiAgICAgICAga2V5LFxuICAgICAgICBwcm9wZXJ0eSA9PT0gXCJcIlxuICAgICAgICAgID8gYGxheW91dF9faXRlbS0tJHt2YWx1ZX1gXG4gICAgICAgICAgOiBgbGF5b3V0X19pdGVtLS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgbGF5b3V0IGNsYXNzZXMsIGFsaWduIHVzZXMgbGF5b3V0LS17dHlwZX0te3ZhbHVlfVxuICAgICAgLy8gYnV0IGp1c3RpZnkgYW5kIG90aGVycyB1c2UgbGF5b3V0LS17dHlwZX0te3Byb3BlcnR5fS17dmFsdWV9XG4gICAgICBpZiAocHJvcGVydHkgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ2FjaGUuc2V0KGtleSwgYGxheW91dC0tJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3NDYWNoZS5nZXQoa2V5KSE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9QVElNSVpFRCBVVElMSVRJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBvYmplY3QgKGhhcyBhbiBlbGVtZW50IHByb3BlcnR5KVxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogdmFsdWUgaXMgQ29tcG9uZW50TGlrZSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyYWdtZW50IHVzaW5nIHBvb2xpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGZyYWdtZW50UG9vbC5nZXQoKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhIGZyYWdtZW50IGJhY2sgdG8gdGhlIHBvb2wgZm9yIHJldXNlXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wucmVsZWFzZShmcmFnbWVudCk7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIGNsYXNzIHByb2Nlc3Npbmcgd2l0aCBtaW5pbWFsIHN0cmluZyBvcGVyYXRpb25zXG4gKiBIYW5kbGVzIGFycmF5cywgc3RyaW5ncywgY2xhc3NOYW1lIGFsaWFzZXMsIGFuZCByYXdDbGFzcyBlZmZpY2llbnRseVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NOYW1lcyhcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2tpcFByZWZpeCA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgY29uc3QgaGFzUmF3Q2xhc3MgPSBvcHRpb25zLnJhd0NsYXNzO1xuICBjb25zdCBoYXNSZWd1bGFyQ2xhc3MgPSBvcHRpb25zLmNsYXNzIHx8IG9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gIC8vIEZhc3QgcGF0aDogbm8gY2xhc3MgcHJvcGVydGllcyBhdCBhbGxcbiAgaWYgKCFoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzKSByZXR1cm4gb3B0aW9ucztcblxuICAvLyBGYXN0IHBhdGg6IG9ubHkgcmF3Q2xhc3MgYW5kIHNraXBwaW5nIHByZWZpeCAobW9zdCBjb21tb24gcmF3Q2xhc3Mgc2NlbmFyaW8pXG4gIGlmIChoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzICYmIHNraXBQcmVmaXgpIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gICAgLy8gRGlyZWN0IGFzc2lnbm1lbnQgZm9yIHNpbXBsZSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGhhc1Jhd0NsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGFycmF5IGNhc2VcbiAgICAgIHByb2Nlc3NlZC5jbGFzcyA9IGhhc1Jhd0NsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG5cbiAgLy8gRnVsbCBwcm9jZXNzaW5nIHBhdGggKG9ubHkgd2hlbiBuZWVkZWQpXG4gIGNvbnN0IHByb2Nlc3NlZCA9IHsgLi4ub3B0aW9ucyB9O1xuICBsZXQgZmluYWxDbGFzc2VzID0gXCJcIjtcblxuICAvLyBIYW5kbGUgcHJlZml4ZWQgY2xhc3NlcyBvbmx5IGlmIG5vdCBza2lwcGluZyBwcmVmaXhcbiAgaWYgKCFza2lwUHJlZml4ICYmIGhhc1JlZ3VsYXJDbGFzcykge1xuICAgIGxldCBwcmVmaXhlZFN0cmluZyA9IFwiXCI7XG5cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSBBcnJheS5pc0FycmF5KHByb2Nlc3NlZC5jbGFzcylcbiAgICAgICAgPyBwcm9jZXNzZWQuY2xhc3Muam9pbihcIiBcIilcbiAgICAgICAgOiBwcm9jZXNzZWQuY2xhc3M7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzZWQuY2xhc3NOYW1lKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSAocHJlZml4ZWRTdHJpbmcgPyBcIiBcIiA6IFwiXCIpICsgcHJvY2Vzc2VkLmNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4ZWRTdHJpbmcpIHtcbiAgICAgIGZpbmFsQ2xhc3NlcyA9IHByZWZpeGVkU3RyaW5nXG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgoY2xzKSA9PlxuICAgICAgICAgIGNscy5zdGFydHNXaXRoKFBSRUZJWF9XSVRIX0RBU0gpID8gY2xzIDogUFJFRklYX1dJVEhfREFTSCArIGNscyxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHJhd0NsYXNzIChhbHdheXMgcHJvY2Vzc2VkIHdoZW4gcHJlc2VudClcbiAgaWYgKGhhc1Jhd0NsYXNzKSB7XG4gICAgY29uc3QgcmF3U3RyaW5nID0gQXJyYXkuaXNBcnJheShoYXNSYXdDbGFzcylcbiAgICAgID8gaGFzUmF3Q2xhc3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICAgICA6IGhhc1Jhd0NsYXNzO1xuXG4gICAgZmluYWxDbGFzc2VzICs9IChmaW5hbENsYXNzZXMgPyBcIiBcIiA6IFwiXCIpICsgcmF3U3RyaW5nO1xuICB9XG5cbiAgaWYgKGZpbmFsQ2xhc3Nlcykge1xuICAgIHByb2Nlc3NlZC5jbGFzcyA9IGZpbmFsQ2xhc3NlcztcbiAgfVxuXG4gIC8vIENsZWFuIHVwIGluIG9uZSBvcGVyYXRpb25cbiAgZGVsZXRlIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gIGRlbGV0ZSBwcm9jZXNzZWQucmF3Q2xhc3M7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZWQgcGFyYW1ldGVyIGV4dHJhY3Rpb24gZm9yIGFycmF5IHNjaGVtYXNcbiAqIFJlZHVjZXMgbXVsdGlwbGUgYXJyYXkgbG9va3VwcyB3aXRoIGJhdGNoIHByb2Nlc3NpbmdcbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjcmVhdG9yOiBGdW5jdGlvbjtcbiAgbmFtZT86IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3VtZWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBhcmFtZXRlcnMoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGRlZmF1bHRDcmVhdG9yOiBGdW5jdGlvbixcbik6IEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjb25zdCBpdGVtcyA9IHNjaGVtYS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgMyk7XG4gIGxldCBjcmVhdG9yLCBuYW1lLCBvcHRpb25zO1xuICBsZXQgY29uc3VtZWQgPSAxO1xuXG4gIGNvbnN0IFtmaXJzdCwgc2Vjb25kLCB0aGlyZF0gPSBpdGVtcztcblxuICBpZiAodHlwZW9mIGZpcnN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcmVhdG9yID0gZmlyc3Q7XG4gICAgaWYgKHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgICBpZiAoaXNPYmplY3QodGhpcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlyZDtcbiAgICAgICAgY29uc3VtZWQgPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG5hbWUgPSBmaXJzdDtcbiAgICBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlyc3QpKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG9wdGlvbnMgPSBmaXJzdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvcjogY3JlYXRvciB8fCBkZWZhdWx0Q3JlYXRvcixcbiAgICBuYW1lLFxuICAgIG9wdGlvbnM6IChvcHRpb25zIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbnN1bWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgdHlwZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gVVRJTElUSUVTIChTaW1wbGlmaWVkKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBET00gZWxlbWVudCBjcmVhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgdGFnID0gb3B0aW9ucy50YWcgfHwgXCJkaXZcIjtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAob3B0aW9ucy5jbGFzcykge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgb3B0aW9ucy5zdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGV4dENvbnRlbnQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBDT01QT05FTlQgQ1JFQVRJT04gKHdpdGggZGVzdHJ1Y3R1cmluZyBvcHRpbWl6YXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG9wdGltaXplZCBvcHRpb24gcHJvY2Vzc2luZ1xuICogVXNlcyBkZXN0cnVjdHVyaW5nIGZvciBjbGVhbmVyIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gIENvbXBvbmVudDogYW55LFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBhbnkge1xuICB0cnkge1xuICAgIC8vIERlc3RydWN0dXJlIHNwZWNpYWwgY29uZmlncyBpbiBvbmUgb3BlcmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbGF5b3V0OiBsYXlvdXRDb25maWcsXG4gICAgICBsYXlvdXRJdGVtOiBsYXlvdXRJdGVtQ29uZmlnLFxuICAgICAgc3R5bGU6IHN0eWxlQ29uZmlnLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc0NvbmZpZyxcbiAgICAgIGV2ZW50czogZXZlbnRzQ29uZmlnLFxuICAgICAgZXZlbnQsIC8vIExlZ2FjeSBzdXBwb3J0XG4gICAgICAuLi5jbGVhbk9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFVzZSBldmVudHMgb3ZlciBldmVudCAoZXZlbnRzIGlzIHByZWZlcnJlZClcbiAgICBjb25zdCBmaW5hbEV2ZW50c0NvbmZpZyA9IGV2ZW50c0NvbmZpZyB8fCBldmVudDtcblxuICAgIC8vIElmIHN0eWxlIGlzIGEgc3RyaW5nLCBhbHdheXMgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnRcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjbGVhbk9wdGlvbnMuc3R5bGUgPSBzdHlsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29uc3QgaXNDbGFzcyA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ29tcG9uZW50LCBcInByb3RvdHlwZVwiKT8ud3JpdGFibGUgPT09XG4gICAgICAgIGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gaXNDbGFzc1xuICAgICAgPyBuZXcgQ29tcG9uZW50KGNsZWFuT3B0aW9ucylcbiAgICAgIDogQ29tcG9uZW50KGNsZWFuT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9ucyBpZiBjb21wb25lbnQgaGFzIGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29tcG9uZW50IDogbnVsbCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyBBcHBseSBsYXlvdXQgY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0Q29uZmlnKSBhcHBseUxheW91dENsYXNzZXMoZWxlbWVudCwgbGF5b3V0Q29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBsYXlvdXQgaXRlbSBjbGFzc2VzXG4gICAgICAgIGlmIChsYXlvdXRJdGVtQ29uZmlnKSBhcHBseUxheW91dEl0ZW1DbGFzc2VzKGVsZW1lbnQsIGxheW91dEl0ZW1Db25maWcpO1xuXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlXG4gICAgICAgIGlmIChzdHlsZUNvbmZpZyAmJiB0eXBlb2Ygc3R5bGVDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZXNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBldmVudHNcbiAgICAgICAgaWYgKGZpbmFsRXZlbnRzQ29uZmlnICYmIHR5cGVvZiBmaW5hbEV2ZW50c0NvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbmFsRXZlbnRzQ29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBldmVudERlZiBvZiBmaW5hbEV2ZW50c0NvbmZpZykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudERlZikgJiYgZXZlbnREZWYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSA9IGV2ZW50RGVmO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudE5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICBmaW5hbEV2ZW50c0NvbmZpZyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVHUkFURUQgTEFZT1VUIENPTkZJR1VSQVRJT04gKHdpdGggY2FjaGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0Q2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0Q29uZmlnKSByZXR1cm47XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUpIHtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRDb25maWcudHlwZX1gKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHByb3BlcnRpZXMgd2l0aCBjYWNoaW5nXG4gIGNvbnN0IGxheW91dFR5cGUgPSBsYXlvdXRDb25maWcudHlwZSB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpO1xuICBpZiAobGF5b3V0VHlwZSkge1xuICAgIGlmIChsYXlvdXRDb25maWcuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJnYXBcIiwgbGF5b3V0Q29uZmlnLmdhcCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmFsaWduKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiYWxpZ25cIiwgbGF5b3V0Q29uZmlnLmFsaWduKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuanVzdGlmeSkge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImp1c3RpZnlcIiwgbGF5b3V0Q29uZmlnLmp1c3RpZnkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmlkLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcImdyaWRcIiB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpID09PSBcImdyaWRcIikge1xuICAgIGlmICh0eXBlb2YgbGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUoXCJncmlkXCIsIFwiY29sc1wiLCBsYXlvdXRDb25maWcuY29sdW1ucyksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwiYXV0by1maWxsXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImZpbGxcIiwgXCJhdXRvXCIpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZml0XCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgXCJhdXRvLWZpdFwiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuZGVuc2UpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1kZW5zZWApO1xuICAgIGlmIChsYXlvdXRDb25maWcuYXV0b0hlaWdodClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkLWF1dG8taGVpZ2h0YCk7XG4gIH1cblxuICAvLyBSb3ctc3BlY2lmaWMgcHJvcGVydGllc1xuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUgPT09IFwicm93XCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJyb3dcIikge1xuICAgIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gZmFsc2UgfHwgbGF5b3V0Q29uZmlnLndyYXAgPT09IFwibm93cmFwXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbm93cmFwYCk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctd3JhcC1yZXZlcnNlYCk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU3RhY2spXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW1vYmlsZS1zdGFja2ApO1xuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU2Nyb2xsKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc2Nyb2xsYCk7XG4gIH1cblxuICAvLyBDdXN0b20gY2xhc3Nlc1xuICBpZiAobGF5b3V0Q29uZmlnLmNsYXNzKSB7XG4gICAgbGF5b3V0Q29uZmlnLmNsYXNzXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZm9yRWFjaCgoY2xzKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBpdGVtIGNsYXNzZXMgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICogVXNlcyBpbnRlZ3JhdGVkIGNhY2hpbmcgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWcsXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFpdGVtQ29uZmlnKSByZXR1cm47XG5cbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW1gKTtcblxuICAvLyBXaWR0aCBhbmQgcmVzcG9uc2l2ZSBjbGFzc2VzIHdpdGggY2FjaGluZ1xuICBpZiAoaXRlbUNvbmZpZy53aWR0aCAmJiBpdGVtQ29uZmlnLndpZHRoID49IDEgJiYgaXRlbUNvbmZpZy53aWR0aCA8PSAxMikge1xuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwiXCIsIGl0ZW1Db25maWcud2lkdGgpLFxuICAgICk7XG4gIH1cbiAgaWYgKGl0ZW1Db25maWcuc20pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzbVwiLCBpdGVtQ29uZmlnLnNtKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5tZClcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm1kXCIsIGl0ZW1Db25maWcubWQpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmxnKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwibGdcIiwgaXRlbUNvbmZpZy5sZyksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcueGwpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJ4bFwiLCBpdGVtQ29uZmlnLnhsKSxcbiAgICApO1xuXG4gIC8vIEdyaWQgc3BhbiBjbGFzc2VzXG4gIGlmIChpdGVtQ29uZmlnLnNwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzcGFuXCIsIGl0ZW1Db25maWcuc3BhbiksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcucm93U3BhbilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcInJvdy1zcGFuXCIsIGl0ZW1Db25maWcucm93U3BhbiksXG4gICAgKTtcblxuICAvLyBPcmRlciBhbmQgYWxpZ25tZW50XG4gIGlmIChpdGVtQ29uZmlnLm9yZGVyKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwib3JkZXJcIiwgaXRlbUNvbmZpZy5vcmRlciksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcuYWxpZ24pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzZWxmXCIsIGl0ZW1Db25maWcuYWxpZ24pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmF1dG8pXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW0tLWF1dG9gKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgICAgPyBcInJvd1wiXG4gICAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICAgICAgPyBcImdyaWRcIlxuICAgICAgICA6IFwiXCI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgU0NIRU1BIFBST0NFU1NPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYXJyYXktYmFzZWQgc2NoZW1hIGRlZmluaXRpb25zXG4gKiBPcHRpbWl6ZWQgd2l0aCBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBhbmQgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBcnJheVNjaGVtYShcbiAgc2NoZW1hOiBTY2hlbWFJdGVtW10gfCBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIGxldmVsOiBudW1iZXIgPSAwLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBsZXZlbCsrO1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgY29tcG9uZW50czogQXJyYXk8W3N0cmluZywgYW55XT4gPSBbXTtcbiAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICBsZXQgY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gKG9wdGlvbnMgYXMgYW55KS5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc2NoZW1hW2ldO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAvLyBIYW5kbGUgbmVzdGVkIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQgfHwgcGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NBcnJheVNjaGVtYShpdGVtLCBjb250YWluZXIsIGxldmVsLCBvcHRpb25zKTtcbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBjb21wb25lbnRzIGFycmF5IGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5sYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKC4uLnJlc3VsdC5sYXlvdXQuY29tcG9uZW50cyk7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubGF5b3V0LmNvbXBvbmVudHM7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgcmVzdWx0LmxheW91dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uXG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRvcixcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zOiBpdGVtT3B0aW9ucyxcbiAgICAgIGNvbnN1bWVkLFxuICAgIH0gPSBleHRyYWN0UGFyYW1ldGVycyhzY2hlbWEsIGksIGRlZmF1bHRDcmVhdG9yKTtcblxuICAgIGlmICghY3JlYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiU2tpcHBpbmcgdW5zdXBwb3J0ZWQgaXRlbSB0eXBlOlwiLCBpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gZGl2IGZvciBjcmVhdGVFbGVtZW50XG4gICAgaWYgKGNyZWF0b3IgPT09IGNyZWF0ZUVsZW1lbnQgJiYgIShcInRhZ1wiIGluIGl0ZW1PcHRpb25zKSkge1xuICAgICAgaXRlbU9wdGlvbnMudGFnID0gXCJkaXZcIjtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGluZGV4IGJ5IGNvbnN1bWVkIGl0ZW1zIG1pbnVzIDEgKGxvb3AgaW5jcmVtZW50IGhhbmRsZXMgdGhlICsxKVxuICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuXG4gICAgLy8gUHJvY2VzcyBvcHRpb25zIHdpdGggcHJlZml4IC0gb3B0aW1pemVkIGRlY2lzaW9uIGxvZ2ljXG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBpdGVtT3B0aW9ucyA/IGl0ZW1PcHRpb25zLnByZWZpeCA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvY2VzcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBzaG91bGRBcHBseVByZWZpeCB8fCBpdGVtT3B0aW9ucy5yYXdDbGFzc1xuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGl0ZW1PcHRpb25zLCAhc2hvdWxkQXBwbHlQcmVmaXgpXG4gICAgICAgIDogaXRlbU9wdGlvbnM7IC8vIE5vIGNvcHkgbmVlZGVkIGlmIG5vIHByb2Nlc3NpbmdcblxuICAgIC8vIEFkZCBuYW1lIHRvIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgaWYgKFxuICAgICAgbmFtZSAmJlxuICAgICAgIShcIm5hbWVcIiBpbiBwcm9jZXNzZWRPcHRpb25zKSAmJlxuICAgICAgIShjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50IHx8IChjcmVhdG9yIGFzIGFueSkuaXNFbGVtZW50KVxuICAgICkge1xuICAgICAgcHJvY2Vzc2VkT3B0aW9ucy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY3JlYXRvciwgcHJvY2Vzc2VkT3B0aW9ucyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuZWxlbWVudCA6IGNvbXBvbmVudDtcblxuICAgIGlmIChsZXZlbCA9PT0gMSkgbGF5b3V0LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsYXlvdXRbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnRzLnB1c2goW25hbWUsIGNvbXBvbmVudF0pO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCB0byBET01cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBpZiAoXCJpbnNlcnRcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb21wb25lbnQuaW5zZXJ0KGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuX2NvbnRhaW5lciA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9uSW5zZXJ0ZWRcIiBpbiBjb21wb25lbnQgJiZcbiAgICAgICAgICB0eXBlb2YgY29tcG9uZW50Lm9uSW5zZXJ0ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb21wb25lbnQub25JbnNlcnRlZChwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGVuZCBmcmFnbWVudCB0byBwYXJlbnRcbiAgaWYgKHBhcmVudEVsZW1lbnQgJiYgZnJhZ21lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gUmVsZWFzZSBmcmFnbWVudCBiYWNrIHRvIHBvb2xcbiAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcblxuICBsYXlvdXQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgb2JqZWN0LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogU2ltcGxpZmllZCBhbmQgb3B0aW1pemVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdENyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3IgfHwgY3JlYXRlRWxlbWVudDtcblxuICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50IGNyZWF0aW9uXG4gIGlmICgoc2NoZW1hIGFzIGFueSkuZWxlbWVudCAmJiAhcGFyZW50RWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnREZWYgPSAoc2NoZW1hIGFzIGFueSkuZWxlbWVudDtcbiAgICBjb25zdCBjcmVhdGVFbGVtZW50Rm4gPSBlbGVtZW50RGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG5cbiAgICBjb25zdCBlbGVtZW50T3B0aW9ucyA9IGVsZW1lbnREZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID1cbiAgICAgIG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZVxuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGVsZW1lbnRPcHRpb25zKVxuICAgICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGNyZWF0ZUVsZW1lbnRGbixcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMsXG4gICAgKTtcbiAgICBsYXlvdXQuZWxlbWVudCA9IHJvb3RDb21wb25lbnQ7XG4gICAgaWYgKGVsZW1lbnREZWYubmFtZSkgbGF5b3V0W2VsZW1lbnREZWYubmFtZV0gPSByb290Q29tcG9uZW50O1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChlbGVtZW50RGVmLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGlzQ29tcG9uZW50KHJvb3RDb21wb25lbnQpXG4gICAgICAgID8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIDogcm9vdENvbXBvbmVudDtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgICAgICAgZWxlbWVudERlZi5jaGlsZHJlbixcbiAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBub3JtYWwgc2NoZW1hIGVsZW1lbnRzXG4gIGNvbnN0IGZyYWdtZW50ID0gcGFyZW50RWxlbWVudCA/IGNyZWF0ZUZyYWdtZW50KCkgOiBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgZGVmID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgIGlmICghZGVmKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcmVhdG9yID0gZGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBkZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaG91bGRBcHBseVByZWZpeCA9XG4gICAgICBcInByZWZpeFwiIGluIGVsZW1lbnRPcHRpb25zXG4gICAgICAgID8gZWxlbWVudE9wdGlvbnMucHJlZml4XG4gICAgICAgIDogb3B0aW9ucy5wcmVmaXggIT09IGZhbHNlO1xuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPSBzaG91bGRBcHBseVByZWZpeFxuICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgIDogeyAuLi5lbGVtZW50T3B0aW9ucyB9O1xuXG4gICAgaWYgKCFkZWYubmFtZSAmJiBrZXkgIT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBkZWYubmFtZSA9IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoZWxlbWVudENyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGxheW91dFtrZXldID0gY3JlYXRlZDtcbiAgICBpZiAoZGVmLm5hbWUgJiYgZGVmLm5hbWUgIT09IGtleSkgbGF5b3V0W2RlZi5uYW1lXSA9IGNyZWF0ZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQoY3JlYXRlZCkgPyBjcmVhdGVkLmVsZW1lbnQgOiBjcmVhdGVkO1xuICAgIGlmIChmcmFnbWVudCkgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgaWYgKGRlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBwcm9jZXNzT2JqZWN0U2NoZW1hKGRlZi5jaGlsZHJlbiwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgY2hpbGRSZXN1bHQubGF5b3V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RG9tID0gaXNDb21wb25lbnQocGFyZW50RWxlbWVudClcbiAgICAgID8gcGFyZW50RWxlbWVudC5lbGVtZW50XG4gICAgICA6IHBhcmVudEVsZW1lbnQ7XG4gICAgcGFyZW50RG9tLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMQVlPVVQgUkVTVUxUIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmxhdHRlbnMgYSBuZXN0ZWQgbGF5b3V0IGludG8gYSBzaW1wbGUgb2JqZWN0IHdpdGggZWxlbWVudCBhbmQgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkxheW91dChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgZmxhdHRlbmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFsYXlvdXQgfHwgdHlwZW9mIGxheW91dCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZsYXR0ZW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxheW91dFtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgKHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgfHxcbiAgICAgICAgaXNDb21wb25lbnQodmFsdWUpKVxuICAgICkge1xuICAgICAgZmxhdHRlbmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgcmVzdWx0IG9iamVjdCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBmbGF0dGVuZWRDb21wb25lbnRzID0gZmxhdHRlbkxheW91dChsYXlvdXQpO1xuXG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGVsZW1lbnQ6IGxheW91dC5lbGVtZW50LFxuICAgIGNvbXBvbmVudDogZmxhdHRlbmVkQ29tcG9uZW50cyxcblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGxheW91dFtuYW1lXSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkQ29tcG9uZW50cztcbiAgICB9LFxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIC8vIFRyYWNrIGRlc3Ryb3llZCBjb21wb25lbnRzIHRvIGF2b2lkIGRvdWJsZS1kZXN0cm95XG4gICAgICBjb25zdCBkZXN0cm95ZWQgPSBuZXcgU2V0PGFueT4oKTtcblxuICAgICAgLy8gSGVscGVyIHRvIHNhZmVseSBkZXN0cm95IGEgY29tcG9uZW50XG4gICAgICBjb25zdCBkZXN0cm95Q29tcG9uZW50ID0gKGNvbXBvbmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGRlc3Ryb3llZC5oYXMoY29tcG9uZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNraXAgcGxhaW4gSFRNTCBlbGVtZW50cyBhbmQgbm9uLW9iamVjdHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHR5cGVvZiBjb21wb25lbnQgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgd2l0aCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXN0cm95ZWQuYWRkKGNvbXBvbmVudCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gY29tcG9uZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGRlc3Ryb3kgY29tcG9uZW50cyBmcm9tIHRoZSBjb21wb25lbnRzIGFycmF5IChpZiBwcmVzZW50KVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBuYW1lZCBjb21wb25lbnRzIGFyZSBkZXN0cm95ZWQgZXZlbiBpZiBuZXN0ZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIGxheW91dC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gaXRlcmF0ZSBvdmVyIGFsbCBsYXlvdXQga2V5cyBmb3IgYW55IG1pc3NlZCBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJlbGVtZW50XCIgfHwga2V5ID09PSBcImNvbXBvbmVudHNcIikgY29udGludWU7XG4gICAgICAgIGRlc3Ryb3lDb21wb25lbnQobGF5b3V0W2tleV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSByb290IGVsZW1lbnQgZnJvbSBET01cbiAgICAgIGlmIChsYXlvdXQuZWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQobGF5b3V0LmVsZW1lbnQpXG4gICAgICAgICAgPyBsYXlvdXQuZWxlbWVudC5lbGVtZW50XG4gICAgICAgICAgOiBsYXlvdXQuZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHJlZmVyZW5jZXMgdG8gaGVscCBHQ1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGRlbGV0ZSBsYXlvdXRba2V5XTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIEVOVFJZIFBPSU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxheW91dCBmcm9tIHZhcmlvdXMgc2NoZW1hIGZvcm1hdHNcbiAqIFVuaWZpZWQgcHJvY2Vzc29yIGZvciBhcnJheXMsIG9iamVjdHMsIEpTWCwgYW5kIEhUTUwgc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICBzY2hlbWE6IGFueSxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gSGFuZGxlIGZ1bmN0aW9uIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIEhUTUwgc3RyaW5nIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzY2hlbWEudHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGVtcGxhdGUuY29udGVudDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0geyBlbGVtZW50OiBmcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB9O1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBKU1gtbGlrZSBzY2hlbWFzIChhcnJheSB3aXRoIGZ1bmN0aW9uLCBzdHJpbmcsIG9iamVjdCBwYXR0ZXJuKVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgc2NoZW1hLmxlbmd0aCA+PSAzICYmXG4gICAgdHlwZW9mIHNjaGVtYVswXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHNjaGVtYVsxXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYVsyXSlcbiAgKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcHJvY2Vzc29yXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICA/IHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpXG4gICAgOiBwcm9jZXNzT2JqZWN0U2NoZW1hKHNjaGVtYSwgcGFyZW50RWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xlYXIgZnVuY3Rpb25zIGZvciB0aGUgdW5pZmllZCBzeXN0ZW1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNsYXNzQ2FjaGUoKTogdm9pZCB7XG4gIGNsYXNzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRnJhZ21lbnRQb29sKCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvY2Vzc0NsYXNzTmFtZXMsXG4gIGlzQ29tcG9uZW50LFxuICBmbGF0dGVuTGF5b3V0LFxuICBhcHBseUxheW91dENsYXNzZXMsXG4gIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMsXG4gIGNyZWF0ZUxheW91dFJlc3VsdCxcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9jb25maWdcbiAqIEBkZXNjcmlwdGlvbiBFc3NlbnRpYWwgbGF5b3V0IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzXG4gKiBDb3JlIGZ1bmN0aW9uYWxpdHkgaXMgaW50ZWdyYXRlZCBpbnRvIHNjaGVtYS50cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlIGZyb20gbWFpbiBtdHJsIGNvbmZpZ1xuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBTaW1wbGUgRE9NIHV0aWxpdGllc1xuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlbGVtZW50ICYmIGNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQ6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gdXAgcHJldmlvdXMgbGF5b3V0IGNsYXNzZXMgZnJvbSBhbiBlbGVtZW50XG4gKiBVc2VmdWwgZm9yIGR5bmFtaWMgY2xhc3MgbWFuYWdlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjbGVhbiBsYXlvdXQgY2xhc3NlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwTGF5b3V0Q2xhc3NlcyhlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmNsYXNzTGlzdCkgcmV0dXJuO1xuXG4gIC8vIEdldCBhbGwgY2xhc3NlcyBmcm9tIHRoZSBlbGVtZW50XG4gIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpIGFzIHN0cmluZ1tdO1xuXG4gIC8vIEZpbmQgYW5kIHJlbW92ZSBsYXlvdXQtcmVsYXRlZCBjbGFzc2VzXG4gIGNvbnN0IGxheW91dENsYXNzZXMgPSBjbGFzc0xpc3QuZmlsdGVyKFxuICAgIChjbHM6IHN0cmluZykgPT5cbiAgICAgIGNscy5zdGFydHNXaXRoKGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1gKSB8fFxuICAgICAgY2xzLmluY2x1ZGVzKGAtJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYClcbiAgKTtcblxuICAvLyBSZW1vdmUgZWFjaCBsYXlvdXQgY2xhc3NcbiAgbGF5b3V0Q2xhc3Nlcy5mb3JFYWNoKChjbHM6IHN0cmluZykgPT4ge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgTGF5b3V0IHR5cGUgaWYgZm91bmQsIGVtcHR5IHN0cmluZyBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFR5cGUoZWxlbWVudDogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgID8gXCJyb3dcIlxuICAgIDogaGFzQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWRgKVxuICAgID8gXCJncmlkXCJcbiAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBwcmVmaXggZm9yIHRoZSBsYXlvdXQgc3lzdGVtXG4gKiBAcmV0dXJucyBDdXJyZW50IHByZWZpeCB3aXRoIGRhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFByZWZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gUFJFRklYX1dJVEhfREFTSDtcbn1cblxuLyoqXG4gKiBTZXRzIGxheW91dCBjbGFzc2VzIG9uIGFuIGVsZW1lbnQgZHluYW1pY2FsbHlcbiAqIFVzZWZ1bCBmb3IgcHJvZ3JhbW1hdGljIGxheW91dCB1cGRhdGVzXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudFxuICogQHBhcmFtIGxheW91dFR5cGUgLSBMYXlvdXQgdHlwZSB0byBhcHBseVxuICogQHBhcmFtIGNsYXNzZXMgLSBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IGFueSxcbiAgbGF5b3V0VHlwZTogc3RyaW5nLFxuICBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFsYXlvdXRUeXBlKSByZXR1cm47XG5cbiAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgbGF5b3V0IGNsYXNzZXMgZmlyc3RcbiAgY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudCk7XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRUeXBlfWApO1xuXG4gIC8vIEFwcGx5IGFkZGl0aW9uYWwgY2xhc3Nlc1xuICBjbGFzc2VzLmZvckVhY2goKGNscykgPT4ge1xuICAgIGlmIChjbHMuc3RhcnRzV2l0aChcImxheW91dC0tXCIpIHx8IGNscy5zdGFydHNXaXRoKFwibGF5b3V0X19cIikpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9JHtjbHN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGNscyk7XG4gICAgfVxuICB9KTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbW9kdWxlIGNvcmUvbGF5b3V0L2pzeFxuICogQGRlc2NyaXB0aW9uIEpTWC1saWtlIHN5bnRheCBzdXBwb3J0IGZvciBsYXlvdXQgY3JlYXRpb25cbiAqIFByb3ZpZGVzIGEgc2ltcGxlIGgoKSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgZWxlbWVudHMgd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMYXlvdXRSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5cbi8qKlxuICogRnJhZ21lbnQgc3ltYm9sIGZvciBKU1ggZnJhZ21lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBGcmFnbWVudCA9IFN5bWJvbChcIkZyYWdtZW50XCIpO1xuXG4vKipcbiAqIEpTWC1saWtlIGh5cGVyc2NyaXB0IGZ1bmN0aW9uXG4gKiBDcmVhdGVzIGVsZW1lbnRzIGluIGEgUmVhY3QtbGlrZSBzeW50YXggd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKlxuICogQHBhcmFtIHRhZyAtIEhUTUwgdGFnIG5hbWUsIGNvbXBvbmVudCBmdW5jdGlvbiwgb3IgRnJhZ21lbnRcbiAqIEBwYXJhbSBwcm9wcyAtIEVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlc1xuICogQHBhcmFtIGNoaWxkcmVuIC0gQ2hpbGQgZWxlbWVudHNcbiAqIEByZXR1cm5zIERPTSBlbGVtZW50IG9yIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaChcbiAgdGFnOiBzdHJpbmcgfCBGdW5jdGlvbiB8IHR5cGVvZiBGcmFnbWVudCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCxcbiAgLi4uY2hpbGRyZW46IGFueVtdXG4pOiBhbnkge1xuICAvLyBIYW5kbGUgRnJhZ21lbnRcbiAgaWYgKHRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgICAgdHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQ7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJpbmcgdGFncyAoSFRNTCBlbGVtZW50cylcbiAgaWYgKHR5cGVvZiB0YWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gICAgLy8gQXBwbHkgcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcImNsYXNzTmFtZVwiIHx8IGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChcIm9uXCIpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gRXZlbnQgaGFuZGxlclxuICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAvLyBTdHlsZSBvYmplY3RcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIikge1xuICAgICAgICAgIC8vIEhUTUwgY29udGVudFxuICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWUuX19odG1sIHx8IFwiXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlZ3VsYXIgYXR0cmlidXRlXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGVuZCBjaGlsZHJlblxuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNoaWxkKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb21wb25lbnQgZnVuY3Rpb25zXG4gIGlmICh0eXBlb2YgdGFnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBhbGxQcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBhbGxQcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGFnKGFsbFByb3BzKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGRpdlxuICByZXR1cm4gaChcImRpdlwiLCBwcm9wcywgLi4uY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgdXNpbmcgSlNYLWxpa2Ugc3ludGF4XG4gKiBQcm92aWRlcyBhIGJyaWRnZSBiZXR3ZWVuIEpTWCBhbmQgdGhlIGxheW91dCBzeXN0ZW1cbiAqXG4gKiBAcGFyYW0ganN4RWxlbWVudCAtIEpTWCBlbGVtZW50IGNyZWF0ZWQgd2l0aCBoKClcbiAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gUGFyZW50IGVsZW1lbnQgdG8gYXR0YWNoIHRvXG4gKiBAcmV0dXJucyBMYXlvdXQgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKc3hMYXlvdXQoXG4gIGpzeEVsZW1lbnQ6IGFueSxcbiAgcGFyZW50RWxlbWVudD86IGFueVxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gQ29udmVydCBKU1ggZWxlbWVudCB0byBsYXlvdXQgc2NoZW1hXG4gIGNvbnN0IHNjaGVtYSA9IGpzeEVsZW1lbnQ7XG5cbiAgLy8gQ3JlYXRlIGxheW91dCB1c2luZyB0aGUgc3RhbmRhcmQgY3JlYXRlTGF5b3V0IGZ1bmN0aW9uXG4gIHJldHVybiBjcmVhdGVMYXlvdXQoc2NoZW1hLCBwYXJlbnRFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIHNpbXBsZSBjb21wb25lbnQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIHJldXNhYmxlIEpTWCBjb21wb25lbnRzXG4gKlxuICogQHBhcmFtIGZuIC0gQ29tcG9uZW50IGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCBpbiBKU1hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudChmbjogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkpOiBGdW5jdGlvbiB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICAgIHJldHVybiBmbihwcm9wcyB8fCB7fSk7XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byByZW5kZXIgbXVsdGlwbGUgSlNYIGVsZW1lbnRzXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIGxpc3RzIG9yIGNvbGxlY3Rpb25zXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gQXJyYXkgb2YgSlNYIGVsZW1lbnRzXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgQXJyYXkgb2YgbGF5b3V0IHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVsZW1lbnRzKFxuICBlbGVtZW50czogYW55W10sXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdFtdIHtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gY3JlYXRlSnN4TGF5b3V0KGVsZW1lbnQsIHBhcmVudEVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBDb21tb24gSlNYIGVsZW1lbnQgY3JlYXRvcnMgZm9yIGNvbnZlbmllbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBqc3ggPSB7XG4gIGRpdjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc3BhbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzcGFuXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHA6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwicFwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBidXR0b246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYnV0dG9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGlucHV0OiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW5wdXRcIiwgcHJvcHMpLFxuICBpbWc6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGgoXCJpbWdcIiwgcHJvcHMpLFxuICBhOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImFcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgdWw6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwidWxcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbGk6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwibGlcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc2VjdGlvbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzZWN0aW9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGhlYWRlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJoZWFkZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgZm9vdGVyOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImZvb3RlclwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBtYWluOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcIm1haW5cIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYXJ0aWNsZTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhcnRpY2xlXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG59O1xuIiwKICAgICIvKipcbiAqIFZpZXdwb3J0IC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBlbmdpbmVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZpZXdwb3J0Q29uZmlnLFxuICBWaWV3cG9ydENvbnRleHQsXG4gIFZpZXdwb3J0Q29tcG9uZW50LFxuICBJdGVtUmFuZ2UsXG4gIFZpZXdwb3J0SW5mbyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEJhc2UgfSBmcm9tIFwiLi9mZWF0dXJlcy9iYXNlXCI7XG5pbXBvcnQgeyB3aXRoVmlydHVhbCB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZpcnR1YWxcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxiYXIgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxiYXJcIjtcbmltcG9ydCB7IHdpdGhDb2xsZWN0aW9uIH0gZnJvbSBcIi4vZmVhdHVyZXMvY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aFBsYWNlaG9sZGVycyB9IGZyb20gXCIuL2ZlYXR1cmVzL3BsYWNlaG9sZGVyc1wiO1xuaW1wb3J0IHsgd2l0aFJlbmRlcmluZyB9IGZyb20gXCIuL2ZlYXR1cmVzL3JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cyB9IGZyb20gXCIuL2ZlYXR1cmVzL2V2ZW50c1wiO1xuXG4vLyBJbnRlcm5hbCB2aWV3cG9ydCBzdGF0ZVxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IEl0ZW1SYW5nZTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgdmVsb2NpdHk6IG51bWJlcjtcbiAgc2Nyb2xsRGlyZWN0aW9uOiBcImZvcndhcmRcIiB8IFwiYmFja3dhcmRcIjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdmlld3BvcnQtZW5oYW5jZWQgY29tcG9uZW50IHVzaW5nIGNvbXBvc2l0aW9uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFZpZXdwb3J0IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCB2aWV3cG9ydCBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZpZXdwb3J0ID0gKGNvbmZpZzogVmlld3BvcnRDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQ+KGNvbXBvbmVudDogVCk6IFQgJiBWaWV3cG9ydENvbXBvbmVudCA9PiB7XG4gICAgLy8gVHJhY2sgaWYgdmlld3BvcnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gcHJldmVudCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbnNcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgLy8gTm8gbm9ybWFsaXphdGlvbiBuZWVkZWQgLSB3ZSdsbCB1c2UgdGhlIG5lc3RlZCBzdHJ1Y3R1cmUgZGlyZWN0bHlcblxuICAgIC8vIENyZWF0ZSBzaGFyZWQgdmlld3BvcnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZTogVmlld3BvcnRTdGF0ZSA9IHtcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiAwLFxuICAgICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMgfHwgMCxcbiAgICAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUgfHwgNTAsXG4gICAgICBjb250YWluZXJTaXplOiAwLFxuICAgICAgdmlydHVhbFRvdGFsU2l6ZTogMCxcbiAgICAgIHZpc2libGVSYW5nZTogeyBzdGFydDogMCwgZW5kOiAwIH0sXG4gICAgICBpdGVtc0NvbnRhaW5lcjogbnVsbCxcbiAgICAgIHZlbG9jaXR5OiAwLFxuICAgICAgc2Nyb2xsRGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGJhc2Ugdmlld3BvcnQgQVBJXG4gICAgY29uc3Qgdmlld3BvcnRBUEkgPSB7XG4gICAgICAvLyBDb3JlIEFQSVxuICAgICAgaW5pdGlhbGl6ZTogKCkgPT4ge1xuICAgICAgICAvLyBQcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbGl6aW5nIHdpdGggc3RhdGU6XCIsIHtcbiAgICAgICAgLy8gICBlbGVtZW50OiAhIWNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgICAvLyAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC50b3RhbEl0ZW1zLFxuICAgICAgICAvLyAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUsXG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgY29udGFpbmVyIHNpemVcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgc3RhdGUuY29udGFpbmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgICAgPyBjb21wb25lbnQuZWxlbWVudC5vZmZzZXRXaWR0aFxuICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBDb250YWluZXIgc2l6ZTpcIiwgc3RhdGUuY29udGFpbmVyU2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgaW5pdGlhbCB2aXJ0dWFsIHNpemVcbiAgICAgICAgc3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IHN0YXRlLnRvdGFsSXRlbXMgKiBzdGF0ZS5pdGVtU2l6ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgaW5pdGlhbCB2aXNpYmxlIHJhbmdlXG4gICAgICAgIHN0YXRlLnZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZVZpc2libGVSYW5nZShzdGF0ZS5zY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIEluaXRpYWwgc3RhdGU6XCIsIHtcbiAgICAgICAgLy8gICBjb250YWluZXJTaXplOiBzdGF0ZS5jb250YWluZXJTaXplLFxuICAgICAgICAvLyAgIHZpcnR1YWxUb3RhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIC8vICAgdmlzaWJsZVJhbmdlOiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIC8vIH0pO1xuICAgICAgfSxcblxuICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbnVwIHdpbGwgYmUgaGFuZGxlZCBieSBmZWF0dXJlc1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlVmlld3BvcnQ6ICgpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSByZW5kZXJpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaXNJbml0aWFsaXplZDogKCkgPT4gaXNJbml0aWFsaXplZCxcblxuICAgICAgLy8gQWxsb3cgZmVhdHVyZXMgdG8gY2hlY2sgaWYgaW5pdCBzaG91bGQgcHJvY2VlZFxuICAgICAgX3Nob3VsZEluaXQ6ICgpID0+ICFpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBTY3JvbGxpbmcgQVBJICh3aWxsIGJlIG92ZXJyaWRkZW4gYnkgc2Nyb2xsaW5nIGZlYXR1cmUpXG4gICAgICBzY3JvbGxUb0luZGV4OiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICAgKSA9PiB7XG4gICAgICAgIC8vIFBsYWNlaG9sZGVyIC0gd2lsbCBiZSBpbXBsZW1lbnRlZCBieSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbjogKHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuXG4gICAgICAvLyBJbmZvIEFQSVxuICAgICAgZ2V0VmlzaWJsZVJhbmdlOiAoKSA9PiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG5cbiAgICAgIGdldFZpZXdwb3J0SW5mbzogKCk6IFZpZXdwb3J0SW5mbyA9PiAoe1xuICAgICAgICBjb250YWluZXJTaXplOiBzdGF0ZS5jb250YWluZXJTaXplLFxuICAgICAgICB0b3RhbFZpcnR1YWxTaXplOiBzdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgdmlydHVhbFNjcm9sbFBvc2l0aW9uOiBzdGF0ZS5zY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pLFxuXG4gICAgICAvLyBSZW5kZXJpbmcgQVBJXG4gICAgICByZW5kZXJJdGVtczogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnRlcm5hbCBzdGF0ZSAoZm9yIGZlYXR1cmVzIHRvIGFjY2VzcylcbiAgICAgIHN0YXRlLFxuICAgIH07XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHZpc2libGUgcmFuZ2VcbiAgICBjb25zdCBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zOiBudW1iZXIpOiBJdGVtUmFuZ2UgPT4ge1xuICAgICAgY29uc3QgaXRlbVNpemUgPSBzdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3MgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoc3RhdGUuY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgdmlzaWJsZUNvdW50LCBzdGF0ZS50b3RhbEl0ZW1zIC0gMSk7XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0OiBNYXRoLm1heCgwLCBzdGFydCksIGVuZDogTWF0aC5tYXgoMCwgZW5kKSB9O1xuICAgIH07XG5cbiAgICAvLyBBZGQgdmlld3BvcnQgQVBJIHRvIGNvbXBvbmVudFxuICAgIGNvbnN0IGJhc2VDb21wb25lbnQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICB2aWV3cG9ydDogdmlld3BvcnRBUEksXG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIHRoZSBlbmhhbmNlbWVudCBwaXBlbGluZVxuICAgIGNvbnN0IGVuaGFuY2VyczogQXJyYXk8KGM6IGFueSkgPT4gYW55PiA9IFtdO1xuXG4gICAgLy8gRXZlbnRzIHN5c3RlbSAoYWx3YXlzIGZpcnN0IC0gcHJvdmlkZXMgY29tbXVuaWNhdGlvbiBmb3Igb3RoZXIgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoRXZlbnRzKHtcbiAgICAgICAgZGVidWc6IGNvbmZpZy5kZWJ1ZyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBCYXNlIHNldHVwIChjcmVhdGVzIERPTSBzdHJ1Y3R1cmUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoQmFzZSh7XG4gICAgICAgIGNsYXNzTmFtZTogY29uZmlnLmNsYXNzTmFtZSxcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFZpcnR1YWwgc2Nyb2xsaW5nIChyZXF1aXJlZCBmb3IgbW9zdCBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhWaXJ0dWFsKHtcbiAgICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgICBhdXRvRGV0ZWN0SXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5hdXRvRGV0ZWN0SXRlbVNpemUsXG4gICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogKGNvbmZpZyBhcyBhbnkpLmluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxpbmcgYmVoYXZpb3JcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIHNlbnNpdGl2aXR5OiBjb25maWcuc2Nyb2xsaW5nPy5zZW5zaXRpdml0eSxcbiAgICAgICAgc21vb3RoaW5nOiBjb25maWcuc2Nyb2xsaW5nPy5hbmltYXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gU2Nyb2xsYmFyIChvcHRpb25hbClcbiAgICBpZiAoY29uZmlnLnNjcm9sbGJhcj8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoU2Nyb2xsYmFyKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGF1dG9IaWRlOiBjb25maWcuc2Nyb2xsYmFyPy5hdXRvSGlkZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGlmIGNvbmZpZ3VyZWRcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoQ29sbGVjdGlvbih7XG4gICAgICAgICAgY29sbGVjdGlvbjogY29uZmlnLmNvbGxlY3Rpb24uYWRhcHRlcixcbiAgICAgICAgICByYW5nZVNpemU6IGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgICBzdHJhdGVneTogY29uZmlnLnBhZ2luYXRpb24/LnN0cmF0ZWd5IGFzXG4gICAgICAgICAgICB8IFwib2Zmc2V0XCJcbiAgICAgICAgICAgIHwgXCJwYWdlXCJcbiAgICAgICAgICAgIHwgXCJjdXJzb3JcIlxuICAgICAgICAgICAgfCB1bmRlZmluZWQsXG4gICAgICAgICAgdHJhbnNmb3JtOiBjb25maWcuY29sbGVjdGlvbj8udHJhbnNmb3JtLFxuICAgICAgICAgIGNhbmNlbExvYWRUaHJlc2hvbGQ6IGNvbmZpZy5wZXJmb3JtYW5jZT8uY2FuY2VsTG9hZFRocmVzaG9sZCxcbiAgICAgICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHM6IGNvbmZpZy5wZXJmb3JtYW5jZT8ubWF4Q29uY3VycmVudFJlcXVlc3RzLFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZTogY29uZmlnLnBlcmZvcm1hbmNlPy5lbmFibGVSZXF1ZXN0UXVldWUgIT09IGZhbHNlLFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogKGNvbmZpZyBhcyBhbnkpLmluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICBzZWxlY3RJZDogKGNvbmZpZyBhcyBhbnkpLnNlbGVjdElkLFxuICAgICAgICAgIGF1dG9Mb2FkOiAoY29uZmlnIGFzIGFueSkuYXV0b0xvYWQgIT09IGZhbHNlLFxuICAgICAgICAgIGF1dG9TZWxlY3RGaXJzdDogKGNvbmZpZyBhcyBhbnkpLmF1dG9TZWxlY3RGaXJzdCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBsYWNlaG9sZGVycyAob3B0aW9uYWwsIHJlcXVpcmVzIGNvbGxlY3Rpb24pXG4gICAgaWYgKGNvbmZpZy5jb2xsZWN0aW9uPy5hZGFwdGVyICYmIGNvbmZpZy5wbGFjZWhvbGRlcnM/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aFBsYWNlaG9sZGVycyh7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhbmFseXplRmlyc3RMb2FkOiBjb25maWcucGxhY2Vob2xkZXJzPy5hbmFseXplRmlyc3RMb2FkID8/IHRydWUsXG4gICAgICAgICAgbWFza0NoYXJhY3RlcjogY29uZmlnLnBsYWNlaG9sZGVycz8ubWFza0NoYXJhY3RlcixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlbmRlcmluZyAoYWx3YXlzIGxhc3QgdG8gaGF2ZSBhY2Nlc3MgdG8gYWxsIGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFJlbmRlcmluZyh7XG4gICAgICAgIHRlbXBsYXRlOiBjb25maWcudGVtcGxhdGUsXG4gICAgICAgIG92ZXJzY2FuOiBjb25maWcudmlydHVhbD8ub3ZlcnNjYW4sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQ29tcG9zZSBhbGwgZW5oYW5jZXJzXG4gICAgY29uc3QgZW5oYW5jZSA9IHBpcGUoLi4uZW5oYW5jZXJzKTtcblxuICAgIC8vIEFwcGx5IGVuaGFuY2VtZW50c1xuICAgIGNvbnN0IGVuaGFuY2VkID0gZW5oYW5jZShiYXNlQ29tcG9uZW50KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBpZiBlbGVtZW50IGlzIHByb3ZpZGVkXG4gICAgaWYgKGVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgIGVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZWQgYXMgVCAmIFZpZXdwb3J0Q29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvdXRpbHMudHNcblxuLyoqXG4gKiBTaGFyZWQgdXRpbGl0aWVzIGZvciB2aWV3cG9ydCBmZWF0dXJlc1xuICogRWxpbWluYXRlcyBjb2RlIGR1cGxpY2F0aW9uIGFjcm9zcyBmZWF0dXJlc1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIFdyYXBzIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uIHdpdGggZmVhdHVyZS1zcGVjaWZpYyBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgaW5pdGlhbGl6YXRpb24gaG9vayBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5pdGlhbGl6ZTxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICBjb21wb25lbnQ6IFQsXG4gIGZlYXR1cmVJbml0OiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IG9yaWdpbmFsSW5pdGlhbGl6ZSA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkIChyZXR1cm5zIGZhbHNlIGlmIGFscmVhZHkgZG9uZSlcbiAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAvLyBPbmx5IHJ1biBmZWF0dXJlIGluaXQgaWYgYmFzZSBpbml0IGFjdHVhbGx5IHJhbiAoZGlkbid0IHJldHVybiBmYWxzZSlcbiAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgZmVhdHVyZUluaXQoKTtcbiAgICB9XG4gICAgLy8gUHJvcGFnYXRlIHRoZSByZXN1bHQgdGhyb3VnaCB0aGUgY2hhaW4gc28gb3V0ZXIgd3JhcHBlcnMga25vdyB0byBza2lwXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBjb21wb25lbnQgZGVzdHJveSB3aXRoIGNsZWFudXAgbG9naWNcbiAqIEVsaW1pbmF0ZXMgdGhlIHJlcGVhdGVkIGRlc3Ryb3kgaG9vayBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwRGVzdHJveTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIGNvbXBvbmVudDogVCxcbiAgY2xlYW51cDogKCkgPT4gdm9pZCxcbik6IHZvaWQge1xuICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHZpZXdwb3J0IHN0YXRlIHdpdGggcHJvcGVyIHR5cGluZ1xuICogRWxpbWluYXRlcyByZXBlYXRlZCAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50OiBWaWV3cG9ydENvbXBvbmVudCk6IGFueSB7XG4gIHJldHVybiAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICogRWxpbWluYXRlcyBkdXBsaWNhdGVkIHBsYWNlaG9sZGVyIGRldGVjdGlvbiBsb2dpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFjZWhvbGRlcihpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpdGVtICYmXG4gICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAoaXRlbS5fcGxhY2Vob2xkZXIgPT09IHRydWUgfHwgaXRlbVtcIl9wbGFjZWhvbGRlclwiXSA9PT0gdHJ1ZSkgLy8gU3VwcG9ydCBib3RoIGFjY2VzcyBwYXR0ZXJuc1xuICApO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByYW5nZSBrZXkgZm9yIGRlZHVwbGljYXRpb25cbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIHRyYWNraW5nIHJhbmdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZ2VLZXkocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtyYW5nZS5zdGFydH0tJHtyYW5nZS5lbmR9YDtcbn1cblxuLyoqXG4gKiBDbGFtcHMgYSB2YWx1ZSBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4gKiBVc2VkIGJ5IG11bHRpcGxlIGZlYXR1cmVzIGZvciBib3VuZGFyeSBjaGVja2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFN0b3JlcyBhIGZ1bmN0aW9uIHJlZmVyZW5jZSBvbiB0aGUgY29tcG9uZW50IGZvciBsYXRlciBhY2Nlc3NcbiAqIEVsaW1pbmF0ZXMgcGF0dGVybiBsaWtlIChjb21wb25lbnQgYXMgYW55KS5fZmVhdHVyZUZ1bmN0aW9uID0gZm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlRmVhdHVyZUZ1bmN0aW9uPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBGdW5jdGlvbixcbik6IHZvaWQge1xuICAoY29tcG9uZW50IGFzIGFueSlbbmFtZV0gPSBmbjtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvYmFzZS50c1xuXG4vKipcbiAqIEJhc2UgVmlld3BvcnQgRmVhdHVyZSAtIFNldHMgdXAgY29yZSB2aWV3cG9ydCBzdHJ1Y3R1cmVcbiAqIFByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBvdGhlciB2aWV3cG9ydCBmZWF0dXJlc1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VDb25maWcge1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIG9yaWVudGF0aW9uPzogXCJ2ZXJ0aWNhbFwiIHwgXCJob3Jpem9udGFsXCI7XG59XG5cbi8qKlxuICogQmFzZSBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogU2V0cyB1cCB0aGUgRE9NIHN0cnVjdHVyZSBhbmQgY29yZSBzdHlsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXNlID0gKGNvbmZpZzogQmFzZUNvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7IGNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydFwiLCBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIiB9ID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHRoZSBzaGFyZWQgd3JhcHBlciB1dGlsaXR5XG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gQ3JlYXRlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICAgICAgbGV0IHZpZXdwb3J0RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIubXRybC12aWV3cG9ydFwiXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICBpZiAoIXZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGA7XG5cbiAgICAgICAgLy8gU2V0IG9yaWVudGF0aW9uXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLW9yaWVudGF0aW9uXCIsIG9yaWVudGF0aW9uKTtcblxuICAgICAgICAvLyBDcmVhdGUgaXRlbXMgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGl0ZW1zQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgaXRlbXNDb250YWluZXIuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1zXCI7XG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBgO1xuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZChpdGVtc0NvbnRhaW5lcik7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodmlld3BvcnRFbGVtZW50KTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGUgd2l0aCBjb250YWluZXJzIHVzaW5nIHV0aWxpdHlcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCk7XG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIHN0YXRlLnZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgICBzdGF0ZS5pdGVtc0NvbnRhaW5lciA9IGl0ZW1zQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlcyBvbiBjb21wb25lbnRcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzXG5cbi8qKlxuICogVmlld3BvcnQgQ29uc3RhbnRzXG4gKiBDZW50cmFsaXplZCBjb25zdGFudHMgZm9yIGFsbCB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5XG4gKiBDb25zb2xpZGF0ZWQgZnJvbSB2aWV3cG9ydCwgdmlld3BvcnQvZmVhdHVyZXMsIGFuZCBsaXN0LW1hbmFnZXIgY29uc3RhbnRzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFZJRVdQT1JUX0NPTlNUQU5UUyA9IHtcbiAgLy8gVmlydHVhbCBzY3JvbGxpbmcgZGVmYXVsdHNcbiAgVklSVFVBTF9TQ1JPTEw6IHtcbiAgICBERUZBVUxUX0lURU1fU0laRTogNDgsXG4gICAgT1ZFUlNDQU5fQlVGRkVSOiAyLFxuICAgIFNDUk9MTF9TRU5TSVRJVklUWTogMC43LFxuICAgIE1BWF9WSVJUVUFMX1NJWkU6IDEwMCAqIDEwMDAgKiAxMDAwLCAvLyAxMDBNIHBpeGVscyAtIG1vZGVybiBicm93c2VycyBjYW4gaGFuZGxlIHRoaXNcbiAgICBBVVRPX0RFVEVDVF9JVEVNX1NJWkU6IHRydWUsIC8vIEVuYWJsZSBhdXRvbWF0aWMgaXRlbSBzaXplIGRldGVjdGlvblxuICB9LFxuXG4gIC8vIFNjcm9sbGluZyBzZXR0aW5nc1xuICBTQ1JPTExJTkc6IHtcbiAgICBPVkVSU0NBTjogMSwgLy8gRnJvbSBmZWF0dXJlcy9jb25zdGFudHNcbiAgfSxcblxuICAvLyBSZW5kZXJpbmcgc2V0dGluZ3NcbiAgUkVOREVSSU5HOiB7XG4gICAgLy8gRWxlbWVudCByZWN5Y2xpbmdcbiAgICBERUZBVUxUX01BWF9QT09MX1NJWkU6IDEwMCxcbiAgICBDTEFTU0VTOiB7XG4gICAgICBJVEVNOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgICB9LFxuICB9LFxuXG4gIC8vIExvYWRpbmcgc2V0dGluZ3NcbiAgTE9BRElORzoge1xuICAgIENBTkNFTF9USFJFU0hPTEQ6IDI1LCAvLyBweC9tcyAtIHZlbG9jaXR5IGFib3ZlIHdoaWNoIGxvYWRzIGNhbmNlbFxuICAgIE1BWF9DT05DVVJSRU5UX1JFUVVFU1RTOiAxLCAvLyBQYXJhbGxlbCByZXF1ZXN0cyBhbGxvd2VkXG4gICAgREVGQVVMVF9SQU5HRV9TSVpFOiAyMCwgLy8gSXRlbXMgcGVyIHJlcXVlc3RcbiAgICBERUJPVU5DRV9MT0FESU5HOiAxNTAsIC8vIERlYm91bmNlIGRlbGF5IChtcylcbiAgICBNSU5fUkFOR0VfU0laRTogMTAsIC8vIE1pbmltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBNQVhfUkFOR0VfU0laRTogMTAwLCAvLyBNYXhpbXVtIGl0ZW1zIHBlciBsb2FkXG4gICAgUkVRVUVTVF9USU1FT1VUOiA1MDAwLCAvLyBSZXF1ZXN0IHRpbWVvdXQgKG1zKVxuICAgIFJFVFJZX0FUVEVNUFRTOiAyLCAvLyBGYWlsZWQgcmVxdWVzdCByZXRyaWVzXG4gICAgUkVUUllfREVMQVk6IDEwMDAsIC8vIERlbGF5IGJldHdlZW4gcmV0cmllcyAobXMpXG4gIH0sXG5cbiAgLy8gUmVxdWVzdCBxdWV1ZSBjb25maWd1cmF0aW9uIChmcm9tIGZlYXR1cmVzL2NvbnN0YW50cylcbiAgUkVRVUVTVF9RVUVVRToge1xuICAgIEVOQUJMRUQ6IHRydWUsIC8vIEVuYWJsZSByZXF1ZXN0IHF1ZXVpbmdcbiAgICBNQVhfUVVFVUVfU0laRTogMSwgLy8gTWF4IHF1ZXVlZCByZXF1ZXN0c1xuICAgIE1BWF9BQ1RJVkVfUkVRVUVTVFM6IDIsIC8vIE1heCBjb25jdXJyZW50IGFjdGl2ZSByZXF1ZXN0c1xuICB9LFxuXG4gIC8vIFBsYWNlaG9sZGVyIHNldHRpbmdzXG4gIFBMQUNFSE9MREVSOiB7XG4gICAgTUFTS19DSEFSQUNURVI6IFwiWFwiLCAvLyBVcGRhdGVkIGZyb20gbGlzdC1tYW5hZ2VyXG4gICAgQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tcGxhY2Vob2xkZXJcIixcbiAgICBNQVhfU0FNUExFX1NJWkU6IDIwLFxuICAgIFBMQUNFSE9MREVSX0ZMQUc6IFwiX3BsYWNlaG9sZGVyXCIsXG4gICAgUkFORE9NX0xFTkdUSF9WQVJJQU5DRTogdHJ1ZSxcbiAgfSxcblxuICAvLyBTcGVlZCB0cmFja2luZyAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIFNQRUVEX1RSQUNLSU5HOiB7XG4gICAgLy8gVmVsb2NpdHkgY2FsY3VsYXRpb25cbiAgICBERUNFTEVSQVRJT05fRkFDVE9SOiAwLjg1LCAvLyB2ZWxvY2l0eSBkZWNheSBwZXIgZnJhbWVcbiAgfSxcblxuICAvLyBNb21lbnR1bSBzZXR0aW5nc1xuICBNT01FTlRVTToge1xuICAgIEVOQUJMRUQ6IGZhbHNlLCAvLyBFbmFibGUgbW9tZW50dW0gYnkgZGVmYXVsdFxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIEhvdyBxdWlja2x5IHZlbG9jaXR5IGRlY3JlYXNlcyBwZXIgZnJhbWVcbiAgICBNSU5fVkVMT0NJVFk6IDAuMSwgLy8gTWluaW11bSB2ZWxvY2l0eSBiZWZvcmUgc3RvcHBpbmcgKHB4L21zKVxuICAgIE1JTl9EVVJBVElPTjogMzAwLCAvLyBNYXhpbXVtIGdlc3R1cmUgZHVyYXRpb24gdG8gdHJpZ2dlciBtb21lbnR1bSAobXMpXG4gICAgTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRDogMC41LCAvLyBNaW5pbXVtIHZlbG9jaXR5IHRvIHRyaWdnZXIgbW9tZW50dW0gKHB4L21zKVxuICAgIEZSQU1FX1RJTUU6IDE2LCAvLyBBc3N1bWVkIGZyYW1lIHRpbWUgZm9yIGNhbGN1bGF0aW9ucyAobXMpXG4gIH0sXG5cbiAgLy8gSW5pdGlhbCBsb2FkIGNvbmZpZ3VyYXRpb24gKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBJTklUSUFMX0xPQUQ6IHtcbiAgICBTVFJBVEVHWTogXCJwbGFjZWhvbGRlcnNcIiwgLy8gXCJwbGFjZWhvbGRlcnNcIiB8IFwiZGlyZWN0XCIgfCBcInByb2dyZXNzaXZlXCJcbiAgICBWSUVXUE9SVF9NVUxUSVBMSUVSOiAxLjUsIC8vIGxvYWQgMS41eCB2aWV3cG9ydCBjYXBhY2l0eVxuICAgIE1JTl9JVEVNUzogMTAsXG4gICAgTUFYX0lURU1TOiAxMDAsXG4gICAgUExBQ0VIT0xERVJfQ09VTlQ6IDIwLCAvLyBkZWZhdWx0IHBsYWNlaG9sZGVyIGNvdW50XG4gICAgU0hPV19MT0FESU5HX1NUQVRFOiB0cnVlLFxuICAgIExPQURJTkdfREVMQVk6IDEwMCwgLy8gbXMgLSBkZWxheSBiZWZvcmUgc2hvd2luZyBsb2FkaW5nIHN0YXRlXG4gIH0sXG5cbiAgLy8gU2VsZWN0aW9uIHNldHRpbmdzXG4gIFNFTEVDVElPTjoge1xuICAgIFNFTEVDVEVEX0NMQVNTOiBcInZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIsXG4gIH0sXG5cbiAgLy8gU2Nyb2xsYmFyIHNldHRpbmdzIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU0NST0xMQkFSOiB7XG4gICAgLy8gQ1NTIGNsYXNzZXNcbiAgICBDTEFTU0VTOiB7XG4gICAgICBTQ1JPTExCQVI6IFwidmlld3BvcnRfX3Njcm9sbGJhclwiLFxuICAgICAgU0NST0xMQkFSX1RSQUNLOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdHJhY2tcIixcbiAgICAgIFNDUk9MTEJBUl9USFVNQjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRodW1iXCIsXG4gICAgICBTQ1JPTExCQVJfVklTSUJMRTogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS12aXNpYmxlXCIsXG4gICAgICBTQ1JPTExCQVJfRFJBR0dJTkc6IFwidmlld3BvcnRfX3Njcm9sbGJhci0tZHJhZ2dpbmdcIixcbiAgICAgIFNDUk9MTEJBUl9USFVNQl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRodW1iLS1kcmFnZ2luZ1wiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gT3JpZW50YXRpb24gKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBPUklFTlRBVElPTjoge1xuICAgIERFRkFVTFRfT1JJRU5UQVRJT046IFwidmVydGljYWxcIixcbiAgICBERUZBVUxUX0NST1NTX0FYSVNfQUxJR05NRU5UOiBcInN0cmV0Y2hcIixcbiAgICBSRVZFUlNFX0RJUkVDVElPTjogZmFsc2UsXG4gIH0sXG5cbiAgUEFHSU5BVElPTjoge1xuICAgIERFRkFVTFRfU1RSQVRFR1k6IFwib2Zmc2V0XCIgYXMgXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIixcbiAgICBERUZBVUxUX0xJTUlUOiAyMCxcbiAgICBTVFJBVEVHSUVTOiB7XG4gICAgICBQQUdFOiBcInBhZ2VcIiBhcyBjb25zdCxcbiAgICAgIE9GRlNFVDogXCJvZmZzZXRcIiBhcyBjb25zdCxcbiAgICAgIENVUlNPUjogXCJjdXJzb3JcIiBhcyBjb25zdCxcbiAgICB9LFxuICAgIENVUlNPUl9DTEVBTlVQX0lOVEVSVkFMOiA2MDAwMCwgLy8gQ2xlYW4gdXAgb2xkIGN1cnNvcnMgZXZlcnkgbWludXRlXG4gICAgTUFYX0NVUlNPUl9NQVBfU0laRTogMTAwMCwgLy8gTWF4aW11bSBudW1iZXIgb2YgY3Vyc29ycyB0byBrZWVwIGluIG1lbW9yeVxuICAgIC8vIEN1cnNvci1zcGVjaWZpYyB2aXJ0dWFsIHNpemluZ1xuICAgIENVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI6IDMsIC8vIE11bHRpcGx5IHJhbmdlU2l6ZSBieSB0aGlzIGZvciBzY3JvbGwgbWFyZ2luXG4gICAgQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjogMywgLy8gTWluaW11bSB2aXJ0dWFsIHNpemUgYXMgbXVsdGlwbGllciBvZiByYW5nZVNpemVcbiAgfSxcbn07XG5cbi8qKlxuICogVHlwZSBmb3Igb3ZlcnJpZGluZyBjb25zdGFudHMgYXQgcnVudGltZVxuICovXG5leHBvcnQgdHlwZSBWaWV3cG9ydENvbnN0YW50cyA9IHR5cGVvZiBWSUVXUE9SVF9DT05TVEFOVFM7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIG1lcmdlIHVzZXIgY29uc3RhbnRzIHdpdGggZGVmYXVsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29uc3RhbnRzKFxuICB1c2VyQ29uc3RhbnRzOiBQYXJ0aWFsPFZpZXdwb3J0Q29uc3RhbnRzPiA9IHt9LFxuKTogVmlld3BvcnRDb25zdGFudHMge1xuICByZXR1cm4ge1xuICAgIC4uLlZJRVdQT1JUX0NPTlNUQU5UUyxcbiAgICAuLi51c2VyQ29uc3RhbnRzLFxuICB9O1xufVxuIiwKICAgICIvKipcbiAqIFZpcnR1YWwgRmVhdHVyZSAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgY2FsY3VsYXRpb25zXG4gKiBIYW5kbGVzIHZpc2libGUgcmFuZ2UgY2FsY3VsYXRpb24gYW5kIHRvdGFsIHZpcnR1YWwgc2l6ZSBtYW5hZ2VtZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbENvbmZpZyB7XG4gIGl0ZW1TaXplPzogbnVtYmVyO1xuICBvdmVyc2Nhbj86IG51bWJlcjtcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbiAgYXV0b0RldGVjdEl0ZW1TaXplPzogYm9vbGVhbjtcbiAgZGVidWc/OiBib29sZWFuO1xuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVmlydHVhbCBzY3JvbGxpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbnMgd2l0aCBjb21wcmVzc2lvbiBmb3IgbGFyZ2UgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhWaXJ0dWFsID0gKGNvbmZpZzogVmlydHVhbENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBpdGVtU2l6ZSxcbiAgICAgIG92ZXJzY2FuID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLk9WRVJTQ0FOX0JVRkZFUixcbiAgICAgIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiLFxuICAgICAgYXV0b0RldGVjdEl0ZW1TaXplID0gaXRlbVNpemUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5BVVRPX0RFVEVDVF9JVEVNX1NJWkVcbiAgICAgICAgOiBmYWxzZSxcbiAgICAgIGRlYnVnID0gZmFsc2UsXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgcHJvdmlkZWQgaXRlbVNpemUgb3IgZGVmYXVsdCwgYnV0IG1hcmsgaWYgd2Ugc2hvdWxkIGF1dG8tZGV0ZWN0XG4gICAgY29uc3QgaW5pdGlhbEl0ZW1TaXplID1cbiAgICAgIGl0ZW1TaXplIHx8IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5ERUZBVUxUX0lURU1fU0laRTtcblxuICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBoYXNDYWxjdWxhdGVkSXRlbVNpemUgPSBmYWxzZTtcbiAgICBsZXQgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVjYWxjdWxhdGVkIHNjcm9sbCBwb3NpdGlvbiBmb3IgY29tcHJlc3Npb25cblxuICAgIC8vIEluaXRpYWxpemUgdXNpbmcgc2hhcmVkIHdyYXBwZXJcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgT2JqZWN0LmFzc2lnbih2aWV3cG9ydFN0YXRlLCB7XG4gICAgICAgIGl0ZW1TaXplOiBpbml0aWFsSXRlbVNpemUsXG4gICAgICAgIG92ZXJzY2FuLFxuICAgICAgICBjb250YWluZXJTaXplOlxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50Py5bXG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgICAgXSB8fCA2MDAsXG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWwgc2Nyb2xsIGluZGV4LCBjYWxjdWxhdGUgaW5pdGlhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgIC8vIE5vdGU6IFdlIHN0b3JlIHRoZSBpbml0aWFsU2Nyb2xsSW5kZXggdG8gdXNlIGRpcmVjdGx5IGluIHJhbmdlIGNhbGN1bGF0aW9uc1xuICAgICAgLy8gYmVjYXVzZSBzY3JvbGwgcG9zaXRpb24gbWF5IGJlIGNvbXByZXNzZWQgZm9yIGxhcmdlIGxpc3RzXG4gICAgICBsZXQgaW5pdGlhbFNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwO1xuXG4gICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAvLyBTdG9yZSB0aGUgdGFyZ2V0IGluZGV4IGZvciB1c2UgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAgICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXggPSBpbml0aWFsU2Nyb2xsSW5kZXg7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiAobWF5IGJlIGNvbXByZXNzZWQgZm9yIGxhcmdlIGxpc3RzKVxuICAgICAgICBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCAqICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSk7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBpbml0aWFsU2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgc2Nyb2xsaW5nIGZlYXR1cmUgaGFzIGluaXRpYWxpemVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogaW5pdGlhbFNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgc291cmNlOiBcImluaXRpYWwtc2Nyb2xsLWluZGV4XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2UoaW5pdGlhbFNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgLy8gRW5zdXJlIGNvbnRhaW5lciBzaXplIGlzIG1lYXN1cmVkIGFmdGVyIERPTSBpcyByZWFkeVxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gICAgY29uc3QgZ2V0Q29tcHJlc3Npb25SYXRpbyA9ICgpOiBudW1iZXIgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplKSByZXR1cm4gMTtcbiAgICAgIGNvbnN0IGFjdHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgcmV0dXJuIGFjdHVhbFNpemUgPD0gTUFYX1ZJUlRVQUxfU0laRSA/IDEgOiBNQVhfVklSVFVBTF9TSVpFIC8gYWN0dWFsU2l6ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgbG9nID0gKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgaWYgKGRlYnVnKSBjb25zb2xlLmxvZyhgW1ZpcnR1YWxdICR7bWVzc2FnZX1gLCBkYXRhKTtcbiAgICB9O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHZpc2libGUgcmFuZ2VcbiAgICBjb25zdCBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UgPSAoXG4gICAgICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLFxuICAgICk6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1ZpcnR1YWxdIE5vIHZpZXdwb3J0IHN0YXRlLCByZXR1cm5pbmcgZW1wdHkgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuXG4gICAgICAvLyBFYXJseSByZXR1cm5zIGZvciBpbnZhbGlkIHN0YXRlc1xuICAgICAgaWYgKFxuICAgICAgICAhY29udGFpbmVyU2l6ZSB8fFxuICAgICAgICBjb250YWluZXJTaXplIDw9IDAgfHxcbiAgICAgICAgIXRvdGFsSXRlbXMgfHxcbiAgICAgICAgdG90YWxJdGVtcyA8PSAwXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIHJhbmdlXG4gICAgICAgIC8vIGV2ZW4gd2hlbiB0b3RhbEl0ZW1zIGlzIDAgKG5vdCB5ZXQgbG9hZGVkIGZyb20gQVBJKVxuICAgICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChcbiAgICAgICAgICAgIChjb250YWluZXJTaXplIHx8IDYwMCkgL1xuICAgICAgICAgICAgICAodmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBpbml0aWFsU2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG4gICAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICB9XG4gICAgICAgIGxvZyhgSW52YWxpZCBzdGF0ZTogY29udGFpbmVyPSR7Y29udGFpbmVyU2l6ZX0sIGl0ZW1zPSR7dG90YWxJdGVtc31gKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aXJ0dWFsU2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSk7XG4gICAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuXG4gICAgICBsZXQgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSB0YXJnZXQgc2Nyb2xsIGluZGV4IChmb3IgaW5pdGlhbFNjcm9sbEluZGV4IHdpdGggY29tcHJlc3Npb24pXG4gICAgICBjb25zdCB0YXJnZXRTY3JvbGxJbmRleCA9ICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG5cbiAgICAgIGlmIChjb21wcmVzc2lvblJhdGlvIDwgMSkge1xuICAgICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIGNhbGN1bGF0aW9uXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSB0YXJnZXRTY3JvbGxJbmRleCwgdXNlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsY3VsYXRpbmcgZnJvbSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIHNob3cgdGhlIGNvcnJlY3QgaXRlbXMgZXZlbiB3aGVuIHZpcnR1YWwgc3BhY2UgaXMgY29tcHJlc3NlZFxuICAgICAgICBpZiAodGFyZ2V0U2Nyb2xsSW5kZXggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIHRhcmdldFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgIGVuZCA9IE1hdGgubWluKFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDEsXG4gICAgICAgICAgICB0YXJnZXRTY3JvbGxJbmRleCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggYWZ0ZXIgZmlyc3QgdXNlIHNvIG5vcm1hbCBzY3JvbGxpbmcgd29ya3NcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFNpemU7XG4gICAgICAgICAgY29uc3QgZXhhY3RJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgICBzdGFydCA9IE1hdGguZmxvb3IoZXhhY3RJbmRleCk7XG4gICAgICAgICAgZW5kID0gTWF0aC5jZWlsKGV4YWN0SW5kZXgpICsgdmlzaWJsZUNvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmVhci1ib3R0b20gaGFuZGxpbmdcbiAgICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdmlydHVhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGwgLSBzY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tIDw9IGNvbnRhaW5lclNpemUgJiYgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xKSB7XG4gICAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb250YWluZXJTaXplIC8gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gY29udGFpbmVyU2l6ZSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIHN0YXJ0ICsgKGZpcnN0VmlzaWJsZUF0Qm90dG9tIC0gc3RhcnQpICogaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGVuZCA9XG4gICAgICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gMVxuICAgICAgICAgICAgICA/IHRvdGFsSXRlbXMgLSAxXG4gICAgICAgICAgICAgIDogTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4pO1xuXG4gICAgICAgICAgbG9nKFwiTmVhciBib3R0b20gY2FsY3VsYXRpb246XCIsIHtcbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSxcbiAgICAgICAgICAgIGludGVycG9sYXRpb24sXG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG92ZXJzY2FuXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBlbmQgKyBvdmVyc2Nhbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXJlY3QgY2FsY3VsYXRpb25cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGguZmxvb3Ioc2Nyb2xsUG9zaXRpb24gLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKSAtIG92ZXJzY2FuLFxuICAgICAgICApO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbiAqIDIpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBvdXRwdXRcbiAgICAgIGlmIChpc05hTihzdGFydCkgfHwgaXNOYU4oZW5kKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1ZpcnR1YWxdIE5hTiBpbiByYW5nZSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICBpdGVtU2l6ZTogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSxcbiAgICAgICAgICBjb21wcmVzc2lvblJhdGlvLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICAvLyBsb2coYFJhbmdlOiAke3N0YXJ0fS0ke2VuZH0gKHNjcm9sbDogJHtzY3JvbGxQb3NpdGlvbn0pYCk7XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGxhc3QgcmFuZ2VcbiAgICAgIC8vIGlmIChlbmQgPj0gdG90YWxJdGVtcyAtIDEwKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbVmlydHVhbF0gTmVhciBlbmQgcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9LCBsYXN0SXRlbVBvcz0ke1xuICAgICAgLy8gICAgICAgZW5kICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZVxuICAgICAgLy8gICAgIH1weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFjdHVhbCB2aXNpYmxlIHJhbmdlICh3aXRob3V0IG92ZXJzY2FuIGJ1ZmZlcilcbiAgICBjb25zdCBjYWxjdWxhdGVBY3R1YWxWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyU2l6ZSwgdG90YWxJdGVtcyB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgIGlmICghY29udGFpbmVyU2l6ZSB8fCAhdG90YWxJdGVtcykgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuXG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemVcbiAgICAgICAgPyAodG90YWxJdGVtcyAqIGl0ZW1TaXplKSAvIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA6IDE7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgLSBjYWxjdWxhdGUgYmFzZWQgb24gc2Nyb2xsIHJhdGlvXG4gICAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFNpemU7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgLSAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zaXRpb24gLyBpdGVtU2l6ZSk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgdmFsaWQgcmFuZ2VcbiAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQpO1xuICAgICAgZW5kID0gTWF0aC5tYXgoc3RhcnQsIGVuZCk7XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgLy8gREVCVUc6IExvZyB3aG8gY2FsbHMgdXBkYXRlVmlzaWJsZVJhbmdlIHdpdGggMCB3aGVuIGl0IHNob3VsZCBiZSBub24temVyb1xuXG4gICAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4pIGZvciBVSSBkaXNwbGF5XG4gICAgICBjb25zdCBhY3R1YWxWaXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVBY3R1YWxWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCB7XG4gICAgICAgIHJhbmdlOiB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBhY3R1YWxWaXNpYmxlUmFuZ2UsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0b3RhbCB2aXJ0dWFsIHNpemVcbiAgICBjb25zdCB1cGRhdGVUb3RhbFZpcnR1YWxTaXplID0gKHRvdGFsSXRlbXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9sZFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemU7XG4gICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbEl0ZW1zO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAvLyBHZXQgcGFkZGluZyBmcm9tIHRoZSBpdGVtcyBjb250YWluZXIgaWYgYXZhaWxhYmxlXG4gICAgICBsZXQgdG90YWxQYWRkaW5nID0gMDtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwYWRkaW5nVG9wID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3ApIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMDtcbiAgICAgICAgdG90YWxQYWRkaW5nID0gcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b207XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2x1ZGUgcGFkZGluZyBpbiB0aGUgdmlydHVhbCBzaXplXG4gICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgYWN0dWFsU2l6ZSArIHRvdGFsUGFkZGluZyxcbiAgICAgICAgTUFYX1ZJUlRVQUxfU0laRSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGRlYnVnZ2luZyBnYXAgaXNzdWVcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1ZpcnR1YWxdIFRvdGFsIHNpemUgdXBkYXRlOiBpdGVtcz0ke3RvdGFsSXRlbXN9LCBpdGVtU2l6ZT0ke3ZpZXdwb3J0U3RhdGUuaXRlbVNpemV9cHgsIHBhZGRpbmc9JHt0b3RhbFBhZGRpbmd9cHgsIHZpcnR1YWxTaXplPSR7dmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplfXB4ICh3YXMgJHtvbGRTaXplfXB4KWBcbiAgICAgIC8vICk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdG90YWxJdGVtczogdG90YWxJdGVtcyxcbiAgICAgICAgY29tcHJlc3Npb25SYXRpbzogZ2V0Q29tcHJlc3Npb25SYXRpbygpLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBjb250YWluZXIgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclNpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgIXZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudFtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgPyBcIm9mZnNldFdpZHRoXCJcbiAgICAgICAgICAgIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICBdO1xuXG4gICAgICAvLyBMb2cgdGhlIGFjdHVhbCBtZWFzdXJlbWVudFxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gQ29udGFpbmVyIHNpemUgbWVhc3VyZWQ6ICR7c2l6ZX1weCBmcm9tIHZpZXdwb3J0IGVsZW1lbnRgXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoc2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7IC8vIEFsc28gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZTogc2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIHZpZXdwb3J0IG1ldGhvZHNcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0VmlzaWJsZVJhbmdlID0gKCkgPT5cbiAgICAgIHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZSB8fFxuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShkYXRhLnBvc2l0aW9uKSxcbiAgICApO1xuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhLnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWxJdGVtcyk7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgcGFnaW5hdGlvbilcbiAgICAvLyBOb3RlOiBzZXRUb3RhbEl0ZW1zKCkgdXBkYXRlcyB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgQkVGT1JFIGVtaXR0aW5nIHRoaXMgZXZlbnQsXG4gICAgLy8gc28gd2UgY2FuJ3QgcmVseSBvbiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgdG8gZGV0ZWN0IHRoZSBmaXJzdCB0b3RhbC5cbiAgICAvLyBJbnN0ZWFkIHdlIHVzZSB0aGUgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gZmxhZy5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAvLyBGSVg6IFdoZW4gd2UgZmlyc3QgcmVjZWl2ZSB0b3RhbEl0ZW1zIHdpdGggaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBjb21wcmVzc2lvbixcbiAgICAgIC8vIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB0byBhY2NvdW50IGZvciBjb21wcmVzc2lvbi5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgaW5pdGlhbFNjcm9sbEluZGV4IGNhbGN1bGF0ZXMgcG9zaXRpb24gYXMgaW5kZXggKiBpdGVtU2l6ZSxcbiAgICAgIC8vIGJ1dCByZW5kZXJpbmcgdXNlcyBjb21wcmVzc2VkIHNwYWNlLCBjYXVzaW5nIGl0ZW1zIHRvIGFwcGVhciBvZmYtc2NyZWVuLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNoZWNrIHRoaXMgQkVGT1JFIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgYmVjYXVzZSB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgICAvLyBzY3JvbGwgcG9zaXRpb24gYmFzZWQgb24gdGhlIG5ldyB0b3RhbCwgYW5kIHRoZSBmbGFnIGVuc3VyZXMgd2Ugb25seSBkbyB0aGlzIG9uY2UuXG4gICAgICBpZiAoXG4gICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiZcbiAgICAgICAgIWhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uICYmXG4gICAgICAgIGRhdGEudG90YWwgPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gZGF0YS50b3RhbCAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB1c2luZyBjb21wcmVzc2lvbi1hd2FyZSBmb3JtdWxhXG4gICAgICAgICAgLy8gU2FtZSBmb3JtdWxhIHVzZWQgaW4gc2Nyb2xsVG9JbmRleFxuICAgICAgICAgIGNvbnN0IHJhdGlvID0gaW5pdGlhbFNjcm9sbEluZGV4IC8gZGF0YS50b3RhbDtcbiAgICAgICAgICBjb25zdCBjb21wcmVzc2VkUG9zaXRpb24gPSByYXRpbyAqIE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gY29tcHJlc3NlZFBvc2l0aW9uO1xuXG4gICAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogY29tcHJlc3NlZFBvc2l0aW9uLFxuICAgICAgICAgICAgc291cmNlOiBcImNvbXByZXNzaW9uLXJlY2FsY3VsYXRpb25cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENsZWFyIHRhcmdldFNjcm9sbEluZGV4IHNpbmNlIHdlJ3ZlIG5vdyBjb3JyZWN0bHkgY2FsY3VsYXRlZCB0aGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgLy8gVGhlIG5vcm1hbCBjb21wcmVzc2VkIHNjcm9sbGluZyBmb3JtdWxhIHdpbGwgbm93IHdvcmsgY29ycmVjdGx5XG4gICAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGFzIGRvbmUgZXZlbiBpZiBub3QgY29tcHJlc3NlZCAtIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGNoZWNrIG9uY2VcbiAgICAgICAgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHRvIHVwZGF0ZSB0aGUgdmlld1xuICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXMgdG8gcmVjYWxjdWxhdGUgdmlydHVhbCBzaXplXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIGRhdGEuY29udGFpbmVyU2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzaXplIHdpdGggbmV3IGNvbnRhaW5lciBzaXplXG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGRhdGEudG90YWwgIT09IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXNcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgfVxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpcnN0IGl0ZW1zIHJlbmRlcmVkIHRvIGNhbGN1bGF0ZSBpdGVtIHNpemUgKGlmIGF1dG8tZGV0ZWN0aW9uIGlzIGVuYWJsZWQpXG4gICAgaWYgKGF1dG9EZXRlY3RJdGVtU2l6ZSkge1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaGFzQ2FsY3VsYXRlZEl0ZW1TaXplICYmXG4gICAgICAgICAgZGF0YS5lbGVtZW50cz8ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHZpZXdwb3J0U3RhdGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgaXRlbSBzaXplIGZyb20gZmlyc3QgcmVuZGVyZWQgYmF0Y2hcbiAgICAgICAgICBjb25zdCBzaXplczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICBjb25zdCBzaXplUHJvcGVydHkgPVxuICAgICAgICAgICAgb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gXCJvZmZzZXRXaWR0aFwiIDogXCJvZmZzZXRIZWlnaHRcIjtcblxuICAgICAgICAgIGRhdGEuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBlbGVtZW50W3NpemVQcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgc2l6ZXMucHVzaChzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzaXplcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhdmdTaXplID0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgc2l6ZXMucmVkdWNlKChzdW0sIHNpemUpID0+IHN1bSArIHNpemUsIDApIC8gc2l6ZXMubGVuZ3RoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSA9IGF2Z1NpemU7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4LCByZWNhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBuZXdseSBkZXRlY3RlZCBpdGVtIHNpemVcbiAgICAgICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwICYmIGF2Z1NpemUgIT09IHByZXZpb3VzSXRlbVNpemUpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2Nyb2xsUG9zaXRpb24gPSBpbml0aWFsU2Nyb2xsSW5kZXggKiBhdmdTaXplO1xuICAgICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gbmV3U2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXdTY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFwiaXRlbS1zaXplLWRldGVjdGVkXCIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSBldmVyeXRoaW5nIHdpdGggbmV3IHNpemVcbiAgICAgICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcbiAgICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgICAgICAgICAvLyBSZS1yZW5kZXIgdG8gYWRqdXN0IHBvc2l0aW9uc1xuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHNpemUgY2hhbmdlXG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6aXRlbS1zaXplLWRldGVjdGVkXCIsIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNTaXplOiBpbml0aWFsSXRlbVNpemUsXG4gICAgICAgICAgICAgIGRldGVjdGVkU2l6ZTogYXZnU2l6ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBoYXNDYWxjdWxhdGVkSXRlbVNpemUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIHZpcnR1YWwgQVBJXG4gICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IGdldENvbXByZXNzaW9uUmF0aW8oKTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkudmlydHVhbCA9IHtcbiAgICAgIGNhbGN1bGF0ZVZpc2libGVSYW5nZSxcbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUsXG4gICAgICBnZXRUb3RhbFZpcnR1YWxTaXplOiAoKSA9PiB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IDAsXG4gICAgICBnZXRDb250YWluZXJTaXplOiAoKSA9PiB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IDAsXG4gICAgICB1cGRhdGVDb250YWluZXJTaXplOiAoc2l6ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldEl0ZW1TaXplOiAoKSA9PiB2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUsXG4gICAgICBjYWxjdWxhdGVJbmRleEZyb21Qb3NpdGlvbjogKHBvc2l0aW9uOiBudW1iZXIpID0+XG4gICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgcG9zaXRpb24gL1xuICAgICAgICAgICAgKCh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyksXG4gICAgICAgICksXG4gICAgICBjYWxjdWxhdGVQb3NpdGlvbkZvckluZGV4OiAoaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgaW5kZXggKiAodmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSAqIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvKipcbiAqIFNjcm9sbGluZyBGZWF0dXJlIC0gVmlydHVhbCBzY3JvbGxpbmcgd2l0aCBpbnRlZ3JhdGVkIHZlbG9jaXR5IHRyYWNraW5nXG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdG91Y2gvbW91c2UgZXZlbnRzLCBzY3JvbGwgcG9zaXRpb24gbWFuYWdlbWVudCwgdmVsb2NpdHkgbWVhc3VyZW1lbnQsIGFuZCBtb21lbnR1bSBzY3JvbGxpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlLCBjbGFtcCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsaW5nQ29uZmlnIHtcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbiAgc2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIHNtb290aGluZz86IGJvb2xlYW47XG4gIGlkbGVUaW1lb3V0PzogbnVtYmVyO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgY29uc3QgaW5zdGFudFZlbG9jaXR5ID0gTWF0aC5hYnMocG9zaXRpb25EZWx0YSkgLyB0aW1lRGVsdGE7XG5cbiAgLy8gQWRkIG5ldyBzYW1wbGVcbiAgY29uc3Qgc2FtcGxlcyA9IFsuLi50cmFja2VyLnNhbXBsZXMsIHsgcG9zaXRpb246IG5ld1Bvc2l0aW9uLCB0aW1lOiBub3cgfV07XG5cbiAgLy8gS2VlcCBvbmx5IHJlY2VudCBzYW1wbGVzIChsYXN0IDEwMG1zKVxuICBjb25zdCByZWNlbnRTYW1wbGVzID0gc2FtcGxlcy5maWx0ZXIoKHMpID0+IG5vdyAtIHMudGltZSA8IDEwMCk7XG5cbiAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgdmVsb2NpdHkgZnJvbSByZWNlbnQgc2FtcGxlc1xuICBsZXQgYXZnVmVsb2NpdHkgPSBpbnN0YW50VmVsb2NpdHk7XG4gIGlmIChyZWNlbnRTYW1wbGVzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBvbGRlc3RTYW1wbGUgPSByZWNlbnRTYW1wbGVzWzBdO1xuICAgIGNvbnN0IHRvdGFsRGlzdGFuY2UgPSBNYXRoLmFicyhuZXdQb3NpdGlvbiAtIG9sZGVzdFNhbXBsZS5wb3NpdGlvbik7XG4gICAgY29uc3QgdG90YWxUaW1lID0gbm93IC0gb2xkZXN0U2FtcGxlLnRpbWU7XG4gICAgYXZnVmVsb2NpdHkgPSB0b3RhbFRpbWUgPiAwID8gdG90YWxEaXN0YW5jZSAvIHRvdGFsVGltZSA6IGluc3RhbnRWZWxvY2l0eTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVsb2NpdHk6IGF2Z1ZlbG9jaXR5LFxuICAgIGxhc3RQb3NpdGlvbjogbmV3UG9zaXRpb24sXG4gICAgbGFzdFRpbWU6IG5vdyxcbiAgICBkaXJlY3Rpb246IHBvc2l0aW9uRGVsdGEgPj0gMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgIHNhbXBsZXM6IHJlY2VudFNhbXBsZXMsXG4gIH07XG59O1xuXG4vKipcbiAqIFNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB3aGVlbCBldmVudHMsIHZlbG9jaXR5IHRyYWNraW5nLCBhbmQgaWRsZSBkZXRlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTY3JvbGxpbmcgPSAoY29uZmlnOiBTY3JvbGxpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBzZW5zaXRpdml0eSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5TQ1JPTExfU0VOU0lUSVZJVFksXG4gICAgICBzbW9vdGhpbmcgPSBmYWxzZSxcbiAgICAgIGlkbGVUaW1lb3V0ID0gMTAwLCAvLyBEZWZhdWx0IGlkbGUgdGltZW91dCBpbiBtc1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBzY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBHZXQgdmlld3BvcnQgc3RhdGVcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuXG4gICAgLy8gVXNlIHNoYXJlZCBpbml0aWFsaXphdGlvbiB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIHZhbHVlc1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICBjb250YWluZXJTaXplID0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplIHx8IDA7XG4gICAgICAgIC8vIFN5bmMgc2Nyb2xsUG9zaXRpb24gZnJvbSB2aWV3cG9ydFN0YXRlIChpbXBvcnRhbnQgZm9yIGluaXRpYWxTY3JvbGxJbmRleClcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFZpcnR1YWwgc2l6ZSBjaGFuZ2VkOlwiLCBkYXRhKTtcbiAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgcG9zaXRpb24gY2hhbmdlcyBmcm9tIG90aGVyIGZlYXR1cmVzIChlLmcuLCB2aXJ0dWFsLnRzIGFmdGVyIGl0ZW0gc2l6ZSBkZXRlY3Rpb24pXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBkYXRhLnBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBsb2NhbCB0cmFja2luZyB2YXJzXG4gICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgY29udGFpbmVyU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQXR0YWNoIHdoZWVsIGV2ZW50IGxpc3RlbmVyIHRvIHZpZXdwb3J0IGVsZW1lbnRcbiAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gQXR0YWNoaW5nIHdoZWVsIGV2ZW50IHRvIHZpZXdwb3J0IGVsZW1lbnRgKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtTY3JvbGxpbmddIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmQgZm9yIHdoZWVsIGV2ZW50c2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXNlIGNsYW1wIGZyb20gdXRpbHNcblxuICAgIC8vIFN0YXJ0IGlkbGUgZGV0ZWN0aW9uXG4gICAgY29uc3Qgc3RhcnRJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBTdGFydGluZyBpZGxlIGRldGVjdGlvblwiKTtcblxuICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gZmlyc3RcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gUmVzZXQgaWRsZSBlbWlzc2lvbiBmbGFnXG4gICAgICBjb25zdCBjaGVja0lkbGUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA9PT0gbGFzdElkbGVDaGVja1Bvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gaGFzbid0IGNoYW5nZWQgLSB3ZSdyZSBpZGxlXG4gICAgICAgICAgaWYgKCFoYXNFbWl0dGVkSWRsZSAmJiAoc3BlZWRUcmFja2VyLnZlbG9jaXR5ID4gMCB8fCBpc1Njcm9sbGluZykpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBcIltTY3JvbGxpbmddIElkbGUgZGV0ZWN0ZWQgLSBwb3NpdGlvbiBzdGFibGUsIHNldHRpbmcgdmVsb2NpdHkgdG8gemVyb1wiXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgaGFzRW1pdHRlZElkbGUgPSB0cnVlOyAvLyBNYXJrIHRoYXQgd2UndmUgZW1pdHRlZCBpZGxlXG4gICAgICAgICAgICBzZXRWZWxvY2l0eVRvWmVybygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQb3NpdGlvbiBjaGFuZ2VkLCByZXNldCB0aGUgZmxhZ1xuICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgICB9O1xuICAgICAgaWRsZUNoZWNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2hlY2tJZGxlKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0b3BJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKGlkbGVDaGVja0ZyYW1lKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RvcHBpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkbGVDaGVja0ZyYW1lKTtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgdmVsb2NpdHkgdG8gemVybyBhbmQgZW1pdCBpZGxlIGV2ZW50XG4gICAgY29uc3Qgc2V0VmVsb2NpdHlUb1plcm8gPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFNldHRpbmcgdmVsb2NpdHkgdG8gemVybyBhbmQgZW1pdHRpbmcgaWRsZVwiKTtcblxuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHdoZWVsIGV2ZW50XG4gICAgY29uc3QgaGFuZGxlV2hlZWwgPSAoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGV2ZW50LmRlbHRhWSA6IGV2ZW50LmRlbHRhWDtcbiAgICAgIGNvbnN0IHNjcm9sbERlbHRhID0gZGVsdGEgKiBzZW5zaXRpdml0eTtcblxuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBsZXQgbmV3UG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbiArIHNjcm9sbERlbHRhO1xuXG4gICAgICAvLyBBcHBseSBzbW9vdGhpbmcgaWYgZW5hYmxlZFxuICAgICAgaWYgKHNtb290aGluZykge1xuICAgICAgICBjb25zdCBzbW9vdGhpbmdGYWN0b3IgPSAwLjM7XG4gICAgICAgIG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YSAqIHNtb290aGluZ0ZhY3RvcjtcbiAgICAgIH1cblxuICAgICAgbmV3UG9zaXRpb24gPSBjbGFtcChuZXdQb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgaWYgKG5ld1Bvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGVcbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAvLyBTdG9wIGFueSBleGlzdGluZyBpZGxlIGRldGVjdGlvbiBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZVxuICAgICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBub3c7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXJcbiAgICAgICAgc3BlZWRUcmFja2VyID0gdXBkYXRlU3BlZWRUcmFja2VyKFxuICAgICAgICAgIHNwZWVkVHJhY2tlcixcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZlbG9jaXR5ID0gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsRGlyZWN0aW9uID0gc3BlZWRUcmFja2VyLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZlbG9jaXR5LWNoYW5nZWRcIiwge1xuICAgICAgICAgIHZlbG9jaXR5OiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbmRlclxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2Nyb2xsIHRvIHBvc2l0aW9uXG4gICAgY29uc3Qgc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IGNsYW1wZWRQb3NpdGlvbiA9IGNsYW1wKHBvc2l0aW9uLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvUG9zaXRpb246IHBvcz0ke3Bvc2l0aW9ufSAtPiAke2NsYW1wZWRQb3NpdGlvbn0sIHNvdXJjZT0ke3NvdXJjZX0sIGN1cnJlbnRQb3M9JHtzY3JvbGxQb3NpdGlvbn0sIHZlbG9jaXR5PSR7c3BlZWRUcmFja2VyLnZlbG9jaXR5LnRvRml4ZWQoXG4gICAgICAvLyAgICAgM1xuICAgICAgLy8gICApfWBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChjbGFtcGVkUG9zaXRpb24gIT09IHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBjbGFtcGVkUG9zaXRpb247XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXIgdG8gY2FsY3VsYXRlIHZlbG9jaXR5XG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgIGNsYW1wZWRQb3NpdGlvbiA+IHByZXZpb3VzUG9zaXRpb24gPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIjtcblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aW1lb3V0c1xuICAgICAgICBpZiAoaWRsZVRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZW91dElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzY3JvbGxCeSBtZXRob2RcbiAgICBjb25zdCBzY3JvbGxCeSA9IChkZWx0YTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGNsYW1wKHNjcm9sbFBvc2l0aW9uICsgZGVsdGEsIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gcHJldmlvdXNQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc2Nyb2xsIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvbiBpZiBub3Qgc2Nyb2xsaW5nXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHBvc2Ugc2Nyb2xsaW5nIHN0YXRlIGZvciBvdGhlciBmZWF0dXJlc1xuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZSA9IHtcbiAgICAgIHNldFZlbG9jaXR5VG9aZXJvLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgdG8gdmlld3BvcnQgQVBJXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5ID0gc2Nyb2xsQnk7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5ID0gKCkgPT4gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBBUElcbiAgICAoY29tcG9uZW50IGFzIGFueSkuc2Nyb2xsaW5nID0ge1xuICAgICAgaGFuZGxlV2hlZWwsXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uLFxuICAgICAgc2Nyb2xsVG9JbmRleCxcbiAgICAgIHNjcm9sbFRvUGFnZSxcbiAgICAgIHNjcm9sbEJ5LFxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzLFxuICAgICAgZ2V0VmVsb2NpdHk6ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgIGdldERpcmVjdGlvbjogKCkgPT4gc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIGlzU2Nyb2xsaW5nOiAoKSA9PiBpc1Njcm9sbGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50c1xuXG4vKipcbiAqIFNjcm9sbGJhciBGZWF0dXJlIC0gQ3VzdG9tIHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvblxuICogUHJvdmlkZXMgdmlzdWFsIHNjcm9sbCBpbmRpY2F0aW9uIGFuZCBkcmFnLXRvLXNjcm9sbCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgd3JhcERlc3Ryb3ksIHN0b3JlRmVhdHVyZUZ1bmN0aW9uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYXV0b0hpZGU/OiBib29sZWFuO1xuICB0aHVtYk1pbkhlaWdodD86IG51bWJlcjtcbiAgdGh1bWJDb2xvcj86IHN0cmluZztcbiAgdHJhY2tDb2xvcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICBmYWRlVGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb21wb25lbnQge1xuICBzY3JvbGxiYXI6IHtcbiAgICBzaG93OiAoKSA9PiB2b2lkO1xuICAgIGhpZGU6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlQm91bmRzOiAodG90YWxWaXJ0dWFsU2l6ZTogbnVtYmVyLCBjb250YWluZXJTaXplOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgdXBkYXRlUG9zaXRpb246IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgc2Nyb2xsYmFyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2Nyb2xsYmFyKGNvbmZpZzogU2Nyb2xsYmFyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVFxuICApOiBUICYgU2Nyb2xsYmFyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGF1dG9IaWRlID0gdHJ1ZSxcbiAgICAgIHRodW1iTWluSGVpZ2h0ID0gMjUsXG4gICAgICBib3JkZXJSYWRpdXMgPSA0LFxuICAgICAgZmFkZVRpbWVvdXQgPSAxMDAwLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBSZXR1cm4gbm8tb3AgaWYgZGlzYWJsZWRcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgc2Nyb2xsYmFyOiB7XG4gICAgICAgICAgc2hvdzogKCkgPT4ge30sXG4gICAgICAgICAgaGlkZTogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlQm91bmRzOiAoKSA9PiB7fSxcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbjogKCkgPT4ge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IHZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc2Nyb2xsYmFyVHJhY2s6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRodW1iOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgZHJhZ1N0YXJ0WSA9IDA7XG4gICAgbGV0IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICBsZXQgaGlkZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgIGxldCBjb250YWluZXJTaXplID0gMDtcbiAgICBsZXQgdGh1bWJIZWlnaHQgPSAwO1xuICAgIGxldCBhbmltYXRpb25GcmFtZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNDdXJzb3JNb2RlID0gZmFsc2U7XG4gICAgbGV0IGxvYWRlZEl0ZW1zQ291bnQgPSAwO1xuXG4gICAgLy8gQ3JlYXRlIHNjcm9sbGJhciBlbGVtZW50c1xuICAgIGNvbnN0IGNyZWF0ZVNjcm9sbGJhckVsZW1lbnRzID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYWRkQ2xhc3Moc2Nyb2xsYmFyVHJhY2ssIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVIpO1xuICAgICAgc2Nyb2xsYmFyVHJhY2suc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgYDtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVEhVTUJcbiAgICAgICk7XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrLmFwcGVuZENoaWxkKHNjcm9sbGJhclRodW1iKTtcbiAgICAgIHZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxiYXJUcmFjayk7XG4gICAgfTtcblxuICAgIC8vIFNob3cvaGlkZSBmdW5jdGlvbnNcbiAgICBjb25zdCBzaG93ID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCB0b3RhbFZpcnR1YWxTaXplIDw9IGNvbnRhaW5lclNpemUpIHJldHVybjtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG5cbiAgICAgIGlmIChhdXRvSGlkZSAmJiAhaXNEcmFnZ2luZykge1xuICAgICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoaGlkZSwgZmFkZVRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCBpc0RyYWdnaW5nKSByZXR1cm47XG4gICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbGJhciBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVCb3VuZHMgPSAobmV3VG90YWxTaXplOiBudW1iZXIsIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcikgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8ICFzY3JvbGxiYXJUaHVtYikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZWVkc1Njcm9sbGJhciA9IHRvdGFsVmlydHVhbFNpemUgPiBjb250YWluZXJTaXplO1xuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSB1cGRhdGVCb3VuZHM6IHRvdGFsU2l6ZT0ke3RvdGFsVmlydHVhbFNpemV9LCBjb250YWluZXJTaXplPSR7Y29udGFpbmVyU2l6ZX0sIG5lZWRzU2Nyb2xsYmFyPSR7bmVlZHNTY3JvbGxiYXJ9YFxuICAgICAgLy8gKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmRpc3BsYXkgPSBuZWVkc1Njcm9sbGJhciA/IFwiYmxvY2tcIiA6IFwibm9uZVwiO1xuXG4gICAgICBpZiAobmVlZHNTY3JvbGxiYXIpIHtcbiAgICAgICAgbGV0IHNjcm9sbFJhdGlvOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBsb2FkZWRJdGVtc0NvdW50ID4gMCkge1xuICAgICAgICAgIC8vIEZvciBjdXJzb3IgbW9kZSwgdGh1bWIgc2l6ZSByZXByZXNlbnRzIGxvYWRlZCBjb250ZW50IHZzIGVzdGltYXRlZCB0b3RhbFxuICAgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgdG90YWwsIHVzZSBsb2FkZWQgaXRlbXMgKiAyIGFzIGVzdGltYXRlXG4gICAgICAgICAgY29uc3QgZXN0aW1hdGVkVG90YWwgPVxuICAgICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA+IDAgPyB0b3RhbFZpcnR1YWxTaXplIDogbG9hZGVkSXRlbXNDb3VudCAqIDI7XG4gICAgICAgICAgc2Nyb2xsUmF0aW8gPVxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSAvXG4gICAgICAgICAgICBNYXRoLm1heChlc3RpbWF0ZWRUb3RhbCwgbG9hZGVkSXRlbXNDb3VudCArIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vcm1hbCBjYWxjdWxhdGlvbiBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgICAgIHNjcm9sbFJhdGlvID0gY29udGFpbmVyU2l6ZSAvIHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHVtYkhlaWdodCA9IE1hdGgubWF4KHRodW1iTWluSGVpZ2h0LCBzY3JvbGxSYXRpbyAqIGNvbnRhaW5lclNpemUpO1xuICAgICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS5oZWlnaHQgPSBgJHt0aHVtYkhlaWdodH1weGA7XG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uKGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSAoc2Nyb2xsUG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVGh1bWIgfHwgIXNjcm9sbGJhclRyYWNrKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVEaXN0YW5jZSA9IHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgaWYgKHNjcm9sbGFibGVEaXN0YW5jZSA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gTWF0aC5taW4oXG4gICAgICAgIDEsXG4gICAgICAgIE1hdGgubWF4KDAsIHNjcm9sbFBvcyAvIHNjcm9sbGFibGVEaXN0YW5jZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0IC0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IHNjcm9sbFJhdGlvICogbWF4VGh1bWJQb3NpdGlvbjtcblxuICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aHVtYlBvc2l0aW9ufXB4KWA7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0cmFjayBjbGlja1xuICAgIGNvbnN0IGhhbmRsZVRyYWNrQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIgfHwgZS50YXJnZXQgPT09IHNjcm9sbGJhclRodW1iKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRyYWNrUmVjdCA9IHNjcm9sbGJhclRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgY2xpY2tZID0gZS5jbGllbnRZIC0gdHJhY2tSZWN0LnRvcDtcbiAgICAgIGNvbnN0IHRodW1iQ2VudGVyWSA9IGNsaWNrWSAtIHRodW1iSGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IG1heFRodW1iUG9zaXRpb24gPSBjb250YWluZXJTaXplIC0gdGh1bWJIZWlnaHQ7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKHRodW1iQ2VudGVyWSwgbWF4VGh1bWJQb3NpdGlvbilcbiAgICAgICk7XG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHRodW1iUG9zaXRpb24gLyBtYXhUaHVtYlBvc2l0aW9uO1xuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9Qb3NpdGlvbih0YXJnZXRTY3JvbGxQb3NpdGlvbik7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzXG4gICAgY29uc3QgaGFuZGxlVGh1bWJNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBkcmFnU3RhcnRZID0gZS5jbGllbnRZO1xuICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIGFkZENsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBkcmFnIHN0YXJ0IGV2ZW50IHRvIG5vdGlmeSB2aWV3cG9ydFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIHN0YXJ0UG9zaXRpb246IGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nIHx8ICFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gZHJhZ1N0YXJ0WTtcbiAgICAgIGNvbnN0IHRyYWNrSGVpZ2h0ID0gc2Nyb2xsYmFyVHJhY2suY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJIZWlnaHQgPSBzY3JvbGxiYXJUaHVtYi5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBtYXhUaHVtYlRyYXZlbCA9IHRyYWNrSGVpZ2h0IC0gdGh1bWJIZWlnaHQ7XG5cbiAgICAgIGlmIChtYXhUaHVtYlRyYXZlbCA8PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhUmF0aW8gPSBkZWx0YVkgLyBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIGNvbnN0IGRyYWdTdGFydFNjcm9sbFJhdGlvID1cbiAgICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gLyAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3U2Nyb2xsUmF0aW8gPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4oMSwgZHJhZ1N0YXJ0U2Nyb2xsUmF0aW8gKyBkZWx0YVJhdGlvKVxuICAgICAgKTtcblxuICAgICAgLy8gVXBkYXRlIHRodW1iIHBvc2l0aW9uIGltbWVkaWF0ZWx5XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiBtYXhUaHVtYlRyYXZlbDtcbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbmV3IHNjcm9sbCBwb3NpdGlvblxuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBuZXdTY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBNb3VzZSBtb3ZlOiBuZXdQb3M9JHtuZXdQb3NpdGlvbi50b0ZpeGVkKFxuICAgICAgLy8gICAgIDBcbiAgICAgIC8vICAgKX0sIGFuaW1hdGlvbkZyYW1lSWQ9JHthbmltYXRpb25GcmFtZUlkfWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIFRocm90dGxlIHZpZXdwb3J0IHVwZGF0ZXNcbiAgICAgIGlmIChhbmltYXRpb25GcmFtZUlkID09PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbU2Nyb2xsYmFyXSBSQUYgY2FsbGJhY2s6IHNjcm9sbGluZyB0byAke2xhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbn1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvUG9zaXRpb24obGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsYmFyXSBNb3VzZSB1cCAtIGVuZGluZyBkcmFnXCIpO1xuICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25GcmFtZUlkKTtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gIT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBlbmQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCB7XG4gICAgICAgIHNvdXJjZTogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgZW5kUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgfSk7XG5cbiAgICAgIGhpZGUoKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgdmlld3BvcnRFbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0YFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1Njcm9sbGJhcl0gTm8gdmlld3BvcnQgZWxlbWVudCBmb3VuZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIGAuJHtQUkVGSVh9LSR7VklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUn1gXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cygpO1xuICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjayAmJiB2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2suYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZVRyYWNrQ2xpY2spO1xuXG4gICAgICAgIGlmIChzY3JvbGxiYXJUaHVtYikge1xuICAgICAgICAgIHNjcm9sbGJhclRodW1iLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlVGh1bWJNb3VzZURvd24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHNob3csIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZWxlYXZlXCIsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSBoaWRlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHBhc3NpdmU6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCB2aWV3cG9ydCBzdGF0ZVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb25zdCBpbmZvID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZpZXdwb3J0SW5mbygpO1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplID0gaW5mby50b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICBjb250YWluZXJTaXplID0gaW5mby5jb250YWluZXJTaXplO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSAoY29tcG9uZW50IGFzIGFueSkuY29uZmlnO1xuICAgICAgICBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgICBzaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGRhdGEudG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGRhdGEuY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBsb2FkZWQgdG8gdXBkYXRlIHNjcm9sbGJhciBpbiBjdXJzb3IgbW9kZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgPSBkYXRhLmxvYWRlZENvdW50IHx8IDA7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBtb2RlKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBkYXRhLnRvdGFsKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHRoZSB0b3RhbCBpcyBkeW5hbWljXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1Njcm9sbGJhcl0gQ3Vyc29yIG1vZGU6IHVwZGF0aW5nIGJvdW5kcyBmb3IgbmV3IHRvdGFsICR7ZGF0YS50b3RhbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCb3VuZHModG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJJbml0aWFsaXplXCIsIGluaXRpYWxpemUpO1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCBpbml0aWFsaXplKTtcblxuICAgIC8vIENsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLnJlbW92ZSgpO1xuICAgICAgICBzY3JvbGxiYXJUcmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgICBzY3JvbGxiYXJUaHVtYiA9IG51bGw7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQgPSBudWxsO1xuICAgICAgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaGlkZVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KTtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgc3RvcmVGZWF0dXJlRnVuY3Rpb24oY29tcG9uZW50LCBcIl9zY3JvbGxiYXJEZXN0cm95XCIsIGRlc3Ryb3kpO1xuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHNjcm9sbGJhcjogeyBzaG93LCBoaWRlLCB1cGRhdGVCb3VuZHMsIHVwZGF0ZVBvc2l0aW9uIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvY29sbGVjdGlvbi50c1xuXG4vKipcbiAqIENvbGxlY3Rpb24gRmVhdHVyZSAtIERhdGEgbWFuYWdlbWVudCBhbmQgcmFuZ2UgbG9hZGluZ1xuICogSGFuZGxlcyBjb2xsZWN0aW9uIGludGVncmF0aW9uLCBwYWdpbmF0aW9uLCBhbmQgZGF0YSBmZXRjaGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcERlc3Ryb3kgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db25maWcge1xuICBjb2xsZWN0aW9uPzogYW55OyAvLyBDb2xsZWN0aW9uIGFkYXB0ZXJcbiAgcmFuZ2VTaXplPzogbnVtYmVyOyAvLyBEZWZhdWx0IHJhbmdlIHNpemUgZm9yIGxvYWRpbmdcbiAgc3RyYXRlZ3k/OiBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiOyAvLyBMb2FkaW5nIHN0cmF0ZWd5XG4gIHRyYW5zZm9ybT86IChpdGVtOiBhbnkpID0+IGFueTsgLy8gSXRlbSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvblxuICBjYW5jZWxMb2FkVGhyZXNob2xkPzogbnVtYmVyOyAvLyBWZWxvY2l0eSB0aHJlc2hvbGQgZm9yIGNhbmNlbGxpbmcgbG9hZHNcbiAgbWF4Q29uY3VycmVudFJlcXVlc3RzPzogbnVtYmVyO1xuICBlbmFibGVSZXF1ZXN0UXVldWU/OiBib29sZWFuO1xuICBtYXhRdWV1ZVNpemU/OiBudW1iZXI7XG4gIGxvYWRPbkRyYWdFbmQ/OiBib29sZWFuOyAvLyBFbmFibGUgbG9hZGluZyB3aGVuIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjsgLy8gSW5pdGlhbCBzY3JvbGwgcG9zaXRpb24gKDAtYmFzZWQgaW5kZXgpXG4gIHNlbGVjdElkPzogc3RyaW5nIHwgbnVtYmVyOyAvLyBJRCBvZiBpdGVtIHRvIHNlbGVjdCBhZnRlciBpbml0aWFsIGxvYWQgY29tcGxldGVzXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGxvYWQgZGF0YSBvbiBpbml0aWFsaXphdGlvbiAoZGVmYXVsdDogdHJ1ZSlcbiAgYXV0b1NlbGVjdEZpcnN0PzogYm9vbGVhbjsgLy8gQXV0b21hdGljYWxseSBzZWxlY3QgZmlyc3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgKGRlZmF1bHQ6IGZhbHNlKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db21wb25lbnQge1xuICBjb2xsZWN0aW9uOiB7XG4gICAgbG9hZFJhbmdlOiAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpID0+IFByb21pc2U8YW55W10+O1xuICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRMb2FkZWRSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiB2b2lkO1xuICAgIHJldHJ5RmFpbGVkUmFuZ2U6IChyYW5nZUlkOiBudW1iZXIpID0+IFByb21pc2U8YW55W10+O1xuICAgIHNldFRvdGFsSXRlbXM6ICh0b3RhbDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IG51bWJlcjtcbiAgICAvLyBDdXJzb3Itc3BlY2lmaWMgbWV0aG9kc1xuICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IHN0cmluZyB8IG51bGw7XG4gICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gc3RyaW5nIHwgbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0eSB0byB2aWV3cG9ydCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbkNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiBDb2xsZWN0aW9uQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcmFuZ2VTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuREVGQVVMVF9SQU5HRV9TSVpFLFxuICAgICAgc3RyYXRlZ3kgPSBcIm9mZnNldFwiLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkNBTkNFTF9USFJFU0hPTEQsXG4gICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHMgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElOR1xuICAgICAgICAuTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFMsXG4gICAgICBlbmFibGVSZXF1ZXN0UXVldWUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5FTkFCTEVELFxuICAgICAgbWF4UXVldWVTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuTUFYX1FVRVVFX1NJWkUsXG4gICAgICBsb2FkT25EcmFnRW5kID0gdHJ1ZSwgLy8gRGVmYXVsdCB0byB0cnVlIGFzIHNhZmV0eSBtZWFzdXJlXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLCAvLyBTdGFydCBmcm9tIGJlZ2lubmluZyBieSBkZWZhdWx0XG4gICAgICBzZWxlY3RJZCwgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBhdXRvTG9hZCA9IHRydWUsIC8vIEF1dG8tbG9hZCBpbml0aWFsIGRhdGEgYnkgZGVmYXVsdFxuICAgICAgYXV0b1NlbGVjdEZpcnN0ID0gZmFsc2UsIC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGxpc3RlbmVyIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICBsZXQgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGhhc0luaXRpYWxTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleCA+IDA7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydCBDb2xsZWN0aW9uXSBJbml0aWFsaXplZCB3aXRoIGNvbmZpZzpcIiwge1xuICAgIC8vICAgc3RyYXRlZ3ksXG4gICAgLy8gICByYW5nZVNpemUsXG4gICAgLy8gICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgc3RhdGVcbiAgICBpbnRlcmZhY2UgUXVldWVkUmVxdWVzdCB7XG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiIHwgXCJub3JtYWxcIiB8IFwibG93XCI7XG4gICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIHRyYWNraW5nXG4gICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgbGV0IGFjdGl2ZUxvYWRDb3VudCA9IDA7XG4gICAgbGV0IGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICBsZXQgZmFpbGVkTG9hZHMgPSAwO1xuICAgIGxldCBjYW5jZWxsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gVHJhY2sgZHJhZyBzdGF0ZVxuXG4gICAgLy8gQ2FjaGUgZXZpY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IE1BWF9DQUNIRURfSVRFTVMgPSA1MDA7IC8vIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICBjb25zdCBFVklDVElPTl9CVUZGRVIgPSAxMDA7IC8vIEV4dHJhIGl0ZW1zIHRvIGtlZXAgYXJvdW5kIHZpc2libGUgcmFuZ2VcblxuICAgIC8vIE1lbW9yeSBkaWFnbm9zdGljc1xuICAgIGNvbnN0IGxvZ01lbW9yeVN0YXRzID0gKGNhbGxlcjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgY29uc3QgbG9hZGVkUmFuZ2VDb3VudCA9IGxvYWRlZFJhbmdlcy5zaXplO1xuICAgICAgY29uc3QgcGVuZGluZ1JhbmdlQ291bnQgPSBwZW5kaW5nUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJDb3VudCA9IGFib3J0Q29udHJvbGxlcnMuc2l6ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZpY3QgaXRlbXMgZmFyIGZyb20gdGhlIGN1cnJlbnQgdmlzaWJsZSByYW5nZSB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAqIEtlZXBzIGl0ZW1zIHdpdGhpbiBFVklDVElPTl9CVUZGRVIgb2YgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBldmljdERpc3RhbnRJdGVtcyA9ICh2aXNpYmxlU3RhcnQ6IG51bWJlciwgdmlzaWJsZUVuZDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuXG4gICAgICAvLyBPbmx5IGV2aWN0IGlmIHdlIGhhdmUgbW9yZSB0aGFuIE1BWF9DQUNIRURfSVRFTVNcbiAgICAgIGlmIChpdGVtQ291bnQgPD0gTUFYX0NBQ0hFRF9JVEVNUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtlZXBTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVTdGFydCAtIEVWSUNUSU9OX0JVRkZFUik7XG4gICAgICBjb25zdCBrZWVwRW5kID0gdmlzaWJsZUVuZCArIEVWSUNUSU9OX0JVRkZFUjtcblxuICAgICAgbGV0IGV2aWN0ZWRDb3VudCA9IDA7XG4gICAgICBjb25zdCByYW5nZXNUb1JlbW92ZTogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gRmluZCBpdGVtcyB0byBldmljdFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXRlbXNbaV0gIT09IHVuZGVmaW5lZCAmJiAoaSA8IGtlZXBTdGFydCB8fCBpID4ga2VlcEVuZCkpIHtcbiAgICAgICAgICBkZWxldGUgaXRlbXNbaV07XG4gICAgICAgICAgZXZpY3RlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxvYWRlZFJhbmdlcyB0byByZWZsZWN0IGV2aWN0ZWQgZGF0YVxuICAgICAgbG9hZGVkUmFuZ2VzLmZvckVhY2goKHJhbmdlSWQpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZ2VTdGFydCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG4gICAgICAgIGNvbnN0IHJhbmdlRW5kID0gcmFuZ2VTdGFydCArIHJhbmdlU2l6ZSAtIDE7XG5cbiAgICAgICAgLy8gSWYgdGhpcyByYW5nZSBpcyBjb21wbGV0ZWx5IG91dHNpZGUgdGhlIGtlZXAgd2luZG93LCByZW1vdmUgaXRcbiAgICAgICAgaWYgKHJhbmdlRW5kIDwga2VlcFN0YXJ0IHx8IHJhbmdlU3RhcnQgPiBrZWVwRW5kKSB7XG4gICAgICAgICAgcmFuZ2VzVG9SZW1vdmUucHVzaChyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJhbmdlc1RvUmVtb3ZlLmZvckVhY2goKHJhbmdlSWQpID0+IHtcbiAgICAgICAgbG9hZGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXZpY3RlZENvdW50ID4gMCkge1xuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgdG8gYWxzbyBjbGVhbiB1cFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIHtcbiAgICAgICAgICBrZWVwU3RhcnQsXG4gICAgICAgICAga2VlcEVuZCxcbiAgICAgICAgICBldmljdGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhY3RpdmVMb2FkUmFuZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IGxvYWRSZXF1ZXN0UXVldWU6IFF1ZXVlZFJlcXVlc3RbXSA9IFtdO1xuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyIG1hcCBmb3IgY2FuY2VsbGluZyBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gbmV3IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj4oKTtcblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEl0ZW1zID0gMDtcbiAgICBsZXQgbG9hZGVkUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IHBlbmRpbmdSYW5nZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBsZXQgZmFpbGVkUmFuZ2VzID0gbmV3IE1hcDxcbiAgICAgIG51bWJlcixcbiAgICAgIHtcbiAgICAgICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICAgICAgbGFzdEVycm9yOiBFcnJvcjtcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9XG4gICAgPigpO1xuICAgIGxldCBhY3RpdmVSZXF1ZXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPGFueVtdPj4oKTtcblxuICAgIC8vIEN1cnNvciBwYWdpbmF0aW9uIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJzb3JNYXAgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpOyAvLyBNYXAgcGFnZSBudW1iZXIgdG8gY3Vyc29yXG4gICAgbGV0IHBhZ2VUb09mZnNldE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7IC8vIE1hcCBwYWdlIHRvIGFjdHVhbCBvZmZzZXRcbiAgICBsZXQgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgIGxldCBkaXNjb3ZlcmVkVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayBkaXNjb3ZlcmVkIHRvdGFsIGZyb20gQVBJXG4gICAgbGV0IGhhc1JlYWNoZWRFbmQgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIGRhdGFcblxuICAgIC8vIFNoYXJlIGl0ZW1zIGFycmF5IHdpdGggY29tcG9uZW50XG4gICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB1bmlxdWUgSUQgZm9yIGEgcmFuZ2UgYmFzZWQgb24gb2Zmc2V0IGFuZCB0aGUgYmFzZSByYW5nZSBzaXplXG4gICAgICovXG4gICAgY29uc3QgZ2V0UmFuZ2VJZCA9IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAvLyBBbHdheXMgdXNlIHRoZSBiYXNlIHJhbmdlU2l6ZSBmb3IgY29uc2lzdGVudCBJRHNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBtZXJnZWQgcmFuZ2VzIGNhbiBiZSB0cmFja2VkIHByb3Blcmx5XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihvZmZzZXQgLyByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgaGVscGVyc1xuICAgIGNvbnN0IGdldFJhbmdlS2V5ID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xuICAgIH07XG5cbiAgICBjb25zdCBjYW5Mb2FkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWZWxvY2l0eSA8PSBjYW5jZWxMb2FkVGhyZXNob2xkO1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZVJlcXVlc3RRdWV1ZSB8fCBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBTb3J0IHF1ZXVlIGJ5IHByaW9yaXR5IGFuZCB0aW1lc3RhbXBcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBwcmlvcml0eU9yZGVyID0geyBoaWdoOiAwLCBub3JtYWw6IDEsIGxvdzogMiB9O1xuICAgICAgICBjb25zdCBwcmlvcml0eURpZmYgPVxuICAgICAgICAgIHByaW9yaXR5T3JkZXJbYS5wcmlvcml0eV0gLSBwcmlvcml0eU9yZGVyW2IucHJpb3JpdHldO1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlEaWZmICE9PSAwID8gcHJpb3JpdHlEaWZmIDogYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJlcXVlc3RzIHVwIHRvIGNhcGFjaXR5XG4gICAgICB3aGlsZSAoXG4gICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbG9hZFJlcXVlc3RRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVRdWV1ZWRMb2FkID0gKHJlcXVlc3Q6IFF1ZXVlZFJlcXVlc3QpID0+IHtcbiAgICAgIGFjdGl2ZUxvYWRDb3VudCsrO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5hZGQoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhY3R1YWwgbG9hZE1pc3NpbmdSYW5nZXMgZnVuY3Rpb25cbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwocmVxdWVzdC5yYW5nZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbXBsZXRlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgIGZhaWxlZExvYWRzKys7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBhY3RpdmVMb2FkQ291bnQtLTtcbiAgICAgICAgICBhY3RpdmVMb2FkUmFuZ2VzLmRlbGV0ZShnZXRSYW5nZUtleShyZXF1ZXN0LnJhbmdlKSk7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gaXRlbXMgaWYgdHJhbnNmb3JtIGZ1bmN0aW9uIHByb3ZpZGVkXG4gICAgICovXG4gICAgY29uc3QgdHJhbnNmb3JtSXRlbXMgPSAocmF3SXRlbXM6IGFueVtdKTogYW55W10gPT4ge1xuICAgICAgaWYgKCF0cmFuc2Zvcm0pIHJldHVybiByYXdJdGVtcztcbiAgICAgIHJldHVybiByYXdJdGVtcy5tYXAodHJhbnNmb3JtKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHJhbmdlIG9mIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdCBsb2FkUmFuZ2UgPSBhc3luYyAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkUmFuZ2UgY2FsbGVkOiBvZmZzZXQ9JHtvZmZzZXR9LCBsaW1pdD0ke2xpbWl0fWAsXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW0NvbGxlY3Rpb25dIE5vIGNvbGxlY3Rpb24gYWRhcHRlciBjb25maWd1cmVkXCIpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhbmdlSWQgPSBnZXRSYW5nZUlkKG9mZnNldCwgbGltaXQpO1xuICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBSYW5nZSBJRDogJHtyYW5nZUlkfWApO1xuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGxvYWRlZFxuICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGFscmVhZHkgbG9hZGVkLCByZXR1cm5pbmcgY2FjaGVkIGRhdGFgLFxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gUmFuZ2UgJHtyYW5nZUlkfSBhbHJlYWR5IHBlbmRpbmdgKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdSZXF1ZXN0ID0gYWN0aXZlUmVxdWVzdHMuZ2V0KHJhbmdlSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJldHVybmluZyBleGlzdGluZyByZXF1ZXN0IGZvciByYW5nZSAke3JhbmdlSWR9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBNYXJraW5nIHJhbmdlICR7cmFuZ2VJZH0gYXMgcGVuZGluZyBhbmQgbG9hZGluZy4uLmAsXG4gICAgICAvLyApO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5hZGQocmFuZ2VJZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBBYm9ydENvbnRyb2xsZXIgZm9yIHRoaXMgcmVxdWVzdFxuICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgYWJvcnRDb250cm9sbGVycy5zZXQocmFuZ2VJZCwgYWJvcnRDb250cm9sbGVyKTtcblxuICAgICAgLy8gQ3JlYXRlIHJlcXVlc3QgcHJvbWlzZVxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIENhbGwgY29sbGVjdGlvbiBhZGFwdGVyIHdpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKG9mZnNldCAvIGxpbWl0KSArIDE7XG4gICAgICAgICAgbGV0IHBhcmFtczogYW55O1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb25cbiAgICAgICAgICAgIGlmIChwYWdlID09PSAxKSB7XG4gICAgICAgICAgICAgIC8vIEZpcnN0IHBhZ2UgLSBubyBjdXJzb3JcbiAgICAgICAgICAgICAgcGFyYW1zID0geyBsaW1pdCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBjdXJzb3IgZm9yIHByZXZpb3VzIHBhZ2VcbiAgICAgICAgICAgICAgY29uc3QgcHJldlBhZ2VDdXJzb3IgPSBjdXJzb3JNYXAuZ2V0KHBhZ2UgLSAxKTtcbiAgICAgICAgICAgICAgaWYgKCFwcmV2UGFnZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIC8vIENhbid0IGxvYWQgdGhpcyBwYWdlIHdpdGhvdXQgcHJldmlvdXMgY3Vyc29yXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gd2l0aG91dCBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFNlcXVlbnRpYWwgbG9hZGluZyByZXF1aXJlZCAtIG1pc3NpbmcgY3Vyc29yIGZvciBwYWdlICR7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgLSAxXG4gICAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBhcmFtcyA9IHsgY3Vyc29yOiBwcmV2UGFnZUN1cnNvciwgbGltaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInBhZ2VcIikge1xuICAgICAgICAgICAgcGFyYW1zID0geyBwYWdlLCBsaW1pdCB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBvZmZzZXQgc3RyYXRlZ3lcbiAgICAgICAgICAgIHBhcmFtcyA9IHsgb2Zmc2V0LCBsaW1pdCB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtWaWV3cG9ydCBDb2xsZWN0aW9uXSBMb2FkaW5nIHJhbmdlIG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9LCBzdHJhdGVneT0ke3N0cmF0ZWd5fSwgY2FsY3VsYXRlZCBwYWdlPSR7cGFnZX0sIHBhcmFtczpgLFxuICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBQYXNzIGFib3J0IHNpZ25hbCB0byB0aGUgYWRhcHRlciBpZiBpdCBzdXBwb3J0cyBpdFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29sbGVjdGlvbi5yZWFkKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgaXRlbXMgYW5kIHRvdGFsXG4gICAgICAgICAgY29uc3QgcmF3SXRlbXMgPSByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLml0ZW1zIHx8IHJlc3BvbnNlO1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSByZXNwb25zZS5tZXRhIHx8IHt9O1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB0cmFjayB0aGUgY3Vyc29yIChjaGVjayBib3RoIGN1cnNvciBhbmQgbmV4dEN1cnNvcilcbiAgICAgICAgICBjb25zdCByZXNwb25zZUN1cnNvciA9IG1ldGEuY3Vyc29yIHx8IG1ldGEubmV4dEN1cnNvcjtcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgcmVzcG9uc2VDdXJzb3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSByZXNwb25zZUN1cnNvcjtcbiAgICAgICAgICAgIGN1cnNvck1hcC5zZXQocGFnZSwgcmVzcG9uc2VDdXJzb3IpO1xuICAgICAgICAgICAgcGFnZVRvT2Zmc2V0TWFwLnNldChwYWdlLCBvZmZzZXQpO1xuICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSBNYXRoLm1heChoaWdoZXN0TG9hZGVkUGFnZSwgcGFnZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9yZWQgY3Vyc29yIGZvciBwYWdlICR7cGFnZX06ICR7cmVzcG9uc2VDdXJzb3J9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmIG1ldGEuaGFzTmV4dCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhhc1JlYWNoZWRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVhY2hlZCBlbmQgb2YgY3Vyc29yIHBhZ2luYXRpb24gYXQgcGFnZSAke3BhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGRpc2NvdmVyZWQgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbWV0YS50b3RhbDogJHttZXRhLnRvdGFsfSwgZGlzY292ZXJlZFRvdGFsIGJlZm9yZTogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChtZXRhLnRvdGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IG1ldGEudG90YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gZGlzY292ZXJlZFRvdGFsIGFmdGVyOiAke2Rpc2NvdmVyZWRUb3RhbH1gKTtcblxuICAgICAgICAgIC8vIFRyYW5zZm9ybSBpdGVtc1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSB0cmFuc2Zvcm1JdGVtcyhyYXdJdGVtcyk7XG5cbiAgICAgICAgICAvLyBBZGQgaXRlbXMgdG8gYXJyYXlcbiAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtc1tvZmZzZXQgKyBpbmRleF0gPSBpdGVtO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBzdHJhdGVneSwgY2FsY3VsYXRlIGR5bmFtaWMgdG90YWwgYmFzZWQgb24gbG9hZGVkIGRhdGFcbiAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICBsZXQgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcblxuICAgICAgICAgIC8vIENSSVRJQ0FMIEZJWDogV2hlbiBBUEkgcmV0dXJucyAwIGl0ZW1zIG9uIHBhZ2UgMSAob2Zmc2V0IDApLCB0aGUgbGlzdCBpcyBlbXB0eS5cbiAgICAgICAgICAvLyBXZSBtdXN0IHNldCB0b3RhbEl0ZW1zIHRvIDAgcmVnYXJkbGVzcyBvZiBtZXRhLnRvdGFsIGJlaW5nIHVuZGVmaW5lZC5cbiAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY291bnQ9ZmFsc2UgaXMgc2VudCBidXQgdGhlIGxpc3QgaXMgYWN0dWFsbHkgZW1wdHkuXG4gICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCAmJiB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gRW1wdHkgcmVzdWx0IG9uIHBhZ2UgMSAtIGZvcmNpbmcgdG90YWxJdGVtcyB0byAwYCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBuZXdUb3RhbCA9IDA7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbmV3VG90YWwgaW5pdGlhbDogJHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM6ICR7dG90YWxJdGVtc30sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJhc2VkIG9uIGxvYWRlZCBpdGVtcyArIG1hcmdpblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPSBoYXNSZWFjaGVkRW5kXG4gICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICA6IHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICAgIGNvbnN0IG1pblZpcnR1YWxJdGVtcyA9XG4gICAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG5cbiAgICAgICAgICAgIC8vIER5bmFtaWMgdG90YWw6IGxvYWRlZCBpdGVtcyArIG1hcmdpbiAodW5sZXNzIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZClcbiAgICAgICAgICAgIG5ld1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgKyBtYXJnaW5JdGVtcyxcbiAgICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ3Vyc29yIG1vZGUgdmlydHVhbCBzaXplOiBsb2FkZWQ9JHtsb2FkZWRJdGVtc0NvdW50fSwgbWFyZ2luPSR7bWFyZ2luSXRlbXN9LCB0b3RhbD0ke25ld1RvdGFsfSwgaGFzUmVhY2hlZEVuZD0ke2hhc1JlYWNoZWRFbmR9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0b3RhbCBpZiBpdCBoYXMgZ3Jvd25cbiAgICAgICAgICAgIGlmIChuZXdUb3RhbCA+IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke25ld1RvdGFsfWAsXG4gICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgIHRvdGFsSXRlbXMgPSBuZXdUb3RhbDtcbiAgICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvciBvdGhlciBzdHJhdGVnaWVzLCB1c2UgZGlzY292ZXJlZCB0b3RhbCBvciBjdXJyZW50IHRvdGFsXG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgZGlzY292ZXJlZFRvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICAgIG5ld1RvdGFsID0gZGlzY292ZXJlZFRvdGFsID8/IHRvdGFsSXRlbXM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIHN0YXRlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEJlZm9yZSBzdGF0ZSB1cGRhdGU6IG5ld1RvdGFsPSR7bmV3VG90YWx9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIHdpbGwgdXBkYXRlOiAke25ld1RvdGFsICE9PSB0b3RhbEl0ZW1zfWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobmV3VG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gQ2FsbGluZyBzZXRUb3RhbEl0ZW1zKCR7bmV3VG90YWx9KWApO1xuICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhuZXdUb3RhbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBpdGVtcyByZWZlcmVuY2VcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgICAgICAgIC8vIEVtaXQgaXRlbXMgY2hhbmdlZCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IG5ld1RvdGFsLFxuICAgICAgICAgICAgbG9hZGVkQ291bnQ6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAvLyBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiB8fCB0byBoYW5kbGUgbmV3VG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gbmV3VG90YWwgPz8gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgYXMgbG9hZGVkXG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJhbmdlICR7cmFuZ2VJZH0gbG9hZGVkIHN1Y2Nlc3NmdWxseSB3aXRoICR7dHJhbnNmb3JtZWRJdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBMb2cgbWVtb3J5IHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgNSBsb2FkcylcbiAgICAgICAgICBpZiAoY29tcGxldGVkTG9hZHMgJSA1ID09PSAwKSB7XG4gICAgICAgICAgICBsb2dNZW1vcnlTdGF0cyhgbG9hZDoke2NvbXBsZXRlZExvYWRzfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBjb2xsZWN0aW9uIGxvYWRlZCBldmVudCB3aXRoIG1vcmUgZGV0YWlsc1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgICAgcmFuZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1zSW5NZW1vcnk6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgICBjdXJzb3I6IHN0cmF0ZWd5ID09PSBcImN1cnNvclwiID8gY3VycmVudEN1cnNvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgdmlld3BvcnQgdXBkYXRlXG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py51cGRhdGVWaWV3cG9ydD8uKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRJdGVtcztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgQWJvcnRFcnJvciBhbmQgXCJGYWlsZWQgdG8gZmV0Y2hcIiAod2hpY2ggY2FuIG9jY3VyIG9uIGFib3J0KSBncmFjZWZ1bGx5XG4gICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgIChlcnJvciBhcyBFcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgfHxcbiAgICAgICAgICAgICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPT09IFwiRmFpbGVkIHRvIGZldGNoXCIgJiZcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKTtcblxuICAgICAgICAgIGlmIChpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgIC8vIERvbid0IHRocm93LCBqdXN0IHJldHVybiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnNcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuXG4gICAgICAgICAgY29uc3QgYXR0ZW1wdHMgPSAoZmFpbGVkUmFuZ2VzLmdldChyYW5nZUlkKT8uYXR0ZW1wdHMgfHwgMCkgKyAxO1xuICAgICAgICAgIGZhaWxlZFJhbmdlcy5zZXQocmFuZ2VJZCwge1xuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1lcnJvclwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVSZXF1ZXN0cy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGFjdGl2ZVJlcXVlc3RzLnNldChyYW5nZUlkLCByZXF1ZXN0UHJvbWlzZSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFByb21pc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgbWlzc2luZyByYW5nZXMgZnJvbSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCA9IGFzeW5jIChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsIC0gcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbmVlZCB0byBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFnZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgZW5kUGFnZSA9IE1hdGguZmxvb3IocmFuZ2UuZW5kIC8gcmFuZ2VTaXplKSArIDE7XG5cbiAgICAgICAgLy8gTGltaXQgaG93IG1hbnkgcGFnZXMgd2UnbGwgbG9hZCBhdCBvbmNlXG4gICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRIaWdoZXN0UGFnZSA9IGhpZ2hlc3RMb2FkZWRQYWdlIHx8IDA7XG4gICAgICAgIGNvbnN0IGxpbWl0ZWRFbmRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgZW5kUGFnZSxcbiAgICAgICAgICBjdXJyZW50SGlnaGVzdFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEN1cnNvciBtb2RlOiBuZWVkIHRvIGxvYWQgcGFnZXMgJHtzdGFydFBhZ2V9IHRvICR7ZW5kUGFnZX0sIGxpbWl0ZWQgdG8gJHtsaW1pdGVkRW5kUGFnZX1gLFxuICAgICAgICAvLyApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gbG9hZCBwYWdlcyBzZXF1ZW50aWFsbHlcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IHN0YXJ0UGFnZTsgcGFnZSA8PSBsaW1pdGVkRW5kUGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgY29uc3QgcmFuZ2VJZCA9IHBhZ2UgLSAxOyAvLyBDb252ZXJ0IHRvIDAtYmFzZWQgcmFuZ2VJZFxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG5cbiAgICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBSYW5nZSBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbXVzdCBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgcHJldmlvdXMgcGFnZXMgbG9hZGVkXG4gICAgICAgICAgICBpZiAocGFnZSA+IDEpIHtcbiAgICAgICAgICAgICAgbGV0IGNhbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICBmb3IgKGxldCBwcmV2UGFnZSA9IDE7IHByZXZQYWdlIDwgcGFnZTsgcHJldlBhZ2UrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZSYW5nZUlkID0gcHJldlBhZ2UgLSAxO1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhwcmV2UmFuZ2VJZCkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSAtIG5lZWQgdG8gbG9hZCBwYWdlICR7cHJldlBhZ2V9IGZpcnN0YCxcbiAgICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgICBjYW5Mb2FkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSBtaXNzaW5nIHBhZ2VcbiAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ1Jhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKHByZXZSYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHByZXJlcXVpc2l0ZSBwYWdlICR7cHJldlBhZ2V9OmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU3RvcCB0cnlpbmcgdG8gbG9hZCBmdXJ0aGVyIHBhZ2VzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghY2FuTG9hZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFnZSBmb3Igbm93XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKG9mZnNldCwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwYWdlICR7cGFnZX06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICBicmVhazsgLy8gU3RvcCBzZXF1ZW50aWFsIGxvYWRpbmcgb24gZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kUGFnZSA+IGxpbWl0ZWRFbmRQYWdlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3BwZWQgYXQgcGFnZSAke2xpbWl0ZWRFbmRQYWdlfSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBsb2FkaW5nIChyZXF1ZXN0ZWQgdXAgdG8gJHtlbmRQYWdlfSlgLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9yaWdpbmFsIGxvZ2ljIGZvciBvZmZzZXQvcGFnZSBzdHJhdGVnaWVzXG4gICAgICAvLyBDYWxjdWxhdGUgcmFuZ2UgYm91bmRhcmllc1xuICAgICAgY29uc3Qgc3RhcnRSYW5nZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpO1xuICAgICAgY29uc3QgZW5kUmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIHBhZ2Ugc3RyYXRlZ3kgLSBzdGFydFJhbmdlOiAke3N0YXJ0UmFuZ2V9LCBlbmRSYW5nZTogJHtlbmRSYW5nZX0sIGxvYWRlZFJhbmdlczogWyR7QXJyYXkuZnJvbShsb2FkZWRSYW5nZXMpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIENvbGxlY3QgcmFuZ2VzIHRoYXQgbmVlZCBsb2FkaW5nXG4gICAgICBjb25zdCByYW5nZXNUb0xvYWQ6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICByYW5nZXNUb0xvYWQucHVzaChyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSByYW5nZXNUb0xvYWQ6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XSwgcGVuZGluZ1JhbmdlczogWyR7QXJyYXkuZnJvbShwZW5kaW5nUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAocmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIE5vIHJhbmdlcyB0byBsb2FkIC0gYWxsIGxvYWRlZCBvciBwZW5kaW5nYCk7XG4gICAgICAgIC8vIEFsbCByYW5nZXMgYXJlIGFscmVhZHkgbG9hZGVkIG9yIHBlbmRpbmdcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHF1ZXVlZCByZXF1ZXN0cyB3ZSBzaG91bGQgcHJvY2Vzc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gTG9hZGluZyAke3Jhbmdlc1RvTG9hZC5sZW5ndGh9IHJhbmdlczogWyR7cmFuZ2VzVG9Mb2FkLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIExvYWQgcmFuZ2VzIGluZGl2aWR1YWxseSAtIG5vIG1lcmdpbmcgdG8gYXZvaWQgbG9hZGluZyBvbGQgcmFuZ2VzXG4gICAgICBjb25zdCBwcm9taXNlcyA9IHJhbmdlc1RvTG9hZC5tYXAoKHJhbmdlSWQpID0+XG4gICAgICAgIGxvYWRSYW5nZShyYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlbG9jaXR5LWF3YXJlIHdyYXBwZXIgZm9yIGxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXMgPSAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByYW5nZUtleSA9IGdldFJhbmdlS2V5KHJhbmdlKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRNaXNzaW5nUmFuZ2VzIGNhbGxlZCAtIHJhbmdlOiAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH0sIGNhbGxlcjogJHtjYWxsZXJ9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkLCBza2lwcGluZ2ApO1xuICAgICAgICAgIC8vIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgd2l0aCBsb3cgdmVsb2NpdHkgKGJ1dCBub3QgaWYgd2UncmUgaWRsZSlcbiAgICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgY3VycmVudFZlbG9jaXR5IDwgMC41ICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIFwiW0NvbGxlY3Rpb25dIExvYWQgc2tpcHBlZCAtIGFjdGl2ZWx5IGRyYWdnaW5nIHdpdGggbG93IHZlbG9jaXR5XCJcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBMb2FkIGNhbmNlbGxlZCAtIHZlbG9jaXR5ICR7Y3VycmVudFZlbG9jaXR5LnRvRml4ZWQoXG4gICAgICAgICAgLy8gICAgIDJcbiAgICAgICAgICAvLyAgICl9IGV4Y2VlZHMgdGhyZXNob2xkICR7Y2FuY2VsTG9hZFRocmVzaG9sZH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjYXBhY2l0eVxuICAgICAgICBpZiAoYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzKSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSAmJlxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIDwgbWF4UXVldWVTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSByZXF1ZXN0XG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtMb2FkaW5nTWFuYWdlcl0gUXVldWVkIHJlcXVlc3QgKGF0IGNhcGFjaXR5KSwgcXVldWUgc2l6ZTogJHtsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBRdWV1ZSBvdmVyZmxvdyAtIHJlc29sdmUgdG8gYXZvaWQgZXJyb3JzXG4gICAgICAgICAgaWYgKGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID49IG1heFF1ZXVlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCAtIG1heFF1ZXVlU2l6ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZW1vdmVkLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0cnkgYSBmYWlsZWQgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCByZXRyeUZhaWxlZFJhbmdlID0gYXN5bmMgKHJhbmdlSWQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIGZhaWxlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgcmV0dXJuIGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0b3RhbCBpdGVtcyBjb3VudFxuICAgICAqL1xuICAgIGNvbnN0IHNldFRvdGFsSXRlbXMgPSAodG90YWw6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgdG90YWxJdGVtcyA9IHRvdGFsO1xuXG4gICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGUncyB0b3RhbCBpdGVtc1xuICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsO1xuICAgICAgfVxuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCB7IHRvdGFsIH0pO1xuICAgIH07XG5cbiAgICAvLyBIb29rIGludG8gdmlld3BvcnQgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHRvdGFsIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMpIHtcbiAgICAgICAgdG90YWxJdGVtcyA9IGNvbXBvbmVudC50b3RhbEl0ZW1zO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGRyYWcgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctZW5kXCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAvLyBQcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHMgYWZ0ZXIgZHJhZyBlbmRzIChzYWZldHkgbWVhc3VyZSlcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHBsYWNlaG9sZGVycyBhcmUgcmVwbGFjZWQgZXZlbiBpZiBpZGxlIGRldGVjdGlvbiBmYWlsc1xuICAgICAgICBpZiAobG9hZE9uRHJhZ0VuZCkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBsb2FkIGR1cmluZyBmYXN0IHNjcm9sbGluZyAtIGxvYWRNaXNzaW5nUmFuZ2VzIHdpbGwgaGFuZGxlIHZlbG9jaXR5IGNoZWNrXG5cbiAgICAgICAgLy8gRXh0cmFjdCByYW5nZSBmcm9tIGV2ZW50IGRhdGEgLSB2aXJ0dWFsIGZlYXR1cmUgZW1pdHMgeyByYW5nZTogeyBzdGFydCwgZW5kIH0sIHNjcm9sbFBvc2l0aW9uIH1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkYXRhLnJhbmdlIHx8IGRhdGE7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2U7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgYmVmb3JlIGxvYWRpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZW5kICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gSW52YWxpZCByYW5nZSBpbiB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW50OlwiLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWwgbG9hZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGluIHZpcnR1YWwudHMgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSAxIGxvYWRcbiAgICAgICAgLy8gYWZ0ZXIgd2UndmUgYWxyZWFkeSBzdGFydGVkIGxvYWRpbmcgdGhlIGNvcnJlY3QgaW5pdGlhbCBwYWdlXG4gICAgICAgIGlmIChoYXNJbml0aWFsU2Nyb2xsSW5kZXggJiYgIWhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQpIHtcbiAgICAgICAgICBjb25zdCBwYWdlMUVuZEluZGV4ID0gcmFuZ2VTaXplIC0gMTsgLy8gZS5nLiwgMjkgZm9yIHJhbmdlU2l6ZT0zMFxuICAgICAgICAgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPD0gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgZm9yIHBhZ2UgMSwgc2tpcCBpdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgbWlzc2luZyByYW5nZXMgaWYgbmVlZGVkXG4gICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIik7XG5cbiAgICAgICAgLy8gRXZpY3QgZGlzdGFudCBpdGVtcyB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAgICBldmljdERpc3RhbnRJdGVtcyhzdGFydCwgZW5kKTtcblxuICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgIWhhc1JlYWNoZWRFbmQpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9XG4gICAgICAgICAgICByYW5nZVNpemUgKlxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICBjb25zdCBtaW5WaXJ0dWFsSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgZHluYW1pY1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ICsgbWFyZ2luSXRlbXMsXG4gICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChkeW5hbWljVG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7ZHluYW1pY1RvdGFsfWAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhkeW5hbWljVG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmVsb2NpdHkgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWZWxvY2l0eSA9IGN1cnJlbnRWZWxvY2l0eTtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gTWF0aC5hYnMoZGF0YS52ZWxvY2l0eSB8fCAwKTtcblxuICAgICAgICAvLyBXaGVuIHZlbG9jaXR5IGRyb3BzIGJlbG93IHRocmVzaG9sZCwgcHJvY2VzcyBxdWV1ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldmlvdXNWZWxvY2l0eSA+IGNhbmNlbExvYWRUaHJlc2hvbGQgJiZcbiAgICAgICAgICBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaWRsZSBzdGF0ZSB0byBwcm9jZXNzIHF1ZXVlXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmlkbGVcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiW0NvbGxlY3Rpb25dIElkbGUgZXZlbnQgcmVjZWl2ZWQsIHZlbG9jaXR5PTBcIik7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IDA7XG5cbiAgICAgICAgLy8gUmVzZXQgZHJhZ2dpbmcgc3RhdGUgb24gaWRsZSBzaW5jZSB1c2VyIGhhcyBzdG9wcGVkIG1vdmluZ1xuICAgICAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW0NvbGxlY3Rpb25dIFJlc2V0dGluZyBkcmFnIHN0YXRlIG9uIGlkbGVcIik7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgdmlzaWJsZSByYW5nZSBvbiBpZGxlOiAke3Zpc2libGVSYW5nZS5zdGFydH0tJHt2aXNpYmxlUmFuZ2UuZW5kfWBcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVtb3Zpbmcgc3RhbGUgcXVldWVkIHJlcXVlc3Q6ICR7cmVxdWVzdFN0YXJ0fS0ke3JlcXVlc3RFbmR9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7IC8vIFJlc29sdmUgdG8gYXZvaWQgaGFuZ2luZyBwcm9taXNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzUmVsZXZhbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBjdXJyZW50IHZpc2libGUgcmFuZ2UgaWYgbmVlZGVkXG4gICAgICAgICAgYXdhaXQgbG9hZE1pc3NpbmdSYW5nZXModmlzaWJsZVJhbmdlLCBcInZpZXdwb3J0OmlkbGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbHNvIHByb2Nlc3MgYW55IHF1ZXVlZCByZXF1ZXN0c1xuICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gcmVtb3ZhbCAtIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlbG9hZFxuICAgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBzaGlmdGVkIGxvY2FsbHkgaW4gYXBpLnRzIGFuZCByZW5kZXJpbmcudHNcbiAgICAgIC8vIFJlbG9hZGluZyB3b3VsZCBjYXVzZSByYWNlIGNvbmRpdGlvbnMgYW5kIG92ZXJ3cml0ZSB0aGUgY29ycmVjdCB0b3RhbEl0ZW1zXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06cmVtb3ZlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbTpyZW1vdmVkIGV2ZW50IC0gaW5kZXg6ICR7ZGF0YS5pbmRleH1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBpdGVtcy5sZW5ndGg6ICR7aXRlbXMubGVuZ3RofWApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNjb3ZlcmVkVG90YWwgdG8gbWF0Y2ggdGhlIG5ldyBjb3VudFxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHN0YWxlIGRpc2NvdmVyZWRUb3RhbCBmcm9tIGJlaW5nIHVzZWQgb24gbmV4dCBsb2FkXG4gICAgICAgIGlmIChkaXNjb3ZlcmVkVG90YWwgIT09IG51bGwgJiYgZGlzY292ZXJlZFRvdGFsID4gMCkge1xuICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCAtIDE7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0ZWQgZGlzY292ZXJlZFRvdGFsIHRvOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBEbyBOT1QgZGVjcmVtZW50IHRvdGFsSXRlbXMgaGVyZSFcbiAgICAgICAgLy8gYXBpLnRzIGFscmVhZHkgY2FsbHMgc2V0VG90YWxJdGVtcygpIGFmdGVyIGVtaXR0aW5nIGl0ZW06cmVtb3ZlLXJlcXVlc3QsXG4gICAgICAgIC8vIHdoaWNoIHByb3Blcmx5IHVwZGF0ZXMgdG90YWxJdGVtcy4gRGVjcmVtZW50aW5nIGhlcmUgd291bGQgY2F1c2UgYSBkb3VibGUtZGVjcmVtZW50LlxuXG4gICAgICAgIC8vIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyAtIHdlIHdhbnQgdG8ga2VlcCB1c2luZyB0aGUgbG9jYWwgZGF0YVxuICAgICAgICAvLyBUaGUgZGF0YSBoYXMgYmVlbiBzaGlmdGVkIGxvY2FsbHkgYW5kIGlzIHN0aWxsIHZhbGlkXG4gICAgICAgIC8vIENsZWFyaW5nIHdvdWxkIHRyaWdnZXIgYSByZWxvYWQgd2hpY2ggY2F1c2VzIHJhY2UgY29uZGl0aW9uc1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEtlZXBpbmcgbG9hZGVkUmFuZ2VzIGludGFjdDpgLFxuICAgICAgICAvLyAgIEFycmF5LmZyb20obG9hZGVkUmFuZ2VzKSxcbiAgICAgICAgLy8gKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2FkIGluaXRpYWwgZGF0YSBpZiBjb2xsZWN0aW9uIGlzIGF2YWlsYWJsZSBhbmQgYXV0b0xvYWQgaXMgZW5hYmxlZFxuICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgYXV0b0xvYWQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCBPUiBhIHNlbGVjdElkLCBsb2FkIGRhdGEgZm9yIHRoYXQgcG9zaXRpb24gZGlyZWN0bHlcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHNjcm9sbFRvSW5kZXgoKSBhcyBpdCB0cmlnZ2VycyBhbmltYXRpb24vdmVsb2NpdHkgdHJhY2tpbmdcbiAgICAgICAgLy8gdmlydHVhbC50cyBoYXMgYWxyZWFkeSBzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgY2FsY3VsYXRlZCB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCB8fFxuICAgICAgICAgIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdElkICE9PSBudWxsKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHZpc2libGUgcmFuZ2UgdGhhdCB3YXMgYWxyZWFkeSBjYWxjdWxhdGVkIGJ5IHZpcnR1YWwudHNcbiAgICAgICAgICAvLyBXZSBtaXNzZWQgdGhlIGluaXRpYWwgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudCBiZWNhdXNlIG91ciBsaXN0ZW5lciB3YXNuJ3QgcmVhZHkgeWV0XG4gICAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlICYmXG4gICAgICAgICAgICAodmlzaWJsZVJhbmdlLnN0YXJ0ID4gMCB8fCB2aXNpYmxlUmFuZ2UuZW5kID4gMClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgcHJlLWNhbGN1bGF0ZWQgdmlzaWJsZSByYW5nZSBmcm9tIHZpcnR1YWwudHNcbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJpbml0aWFsLXBvc2l0aW9uXCIpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIHNlbGVjdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZCBpZiBzZWxlY3RJZCBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgcG9zaXRpb24gZGF0YTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBjYWxjdWxhdGUgcmFuZ2UgZnJvbSBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyBlZGdlIGNhc2VzIHdoZXJlIHZpc2libGVSYW5nZSB3YXNuJ3QgcmVhZHlcbiAgICAgICAgICAgIGNvbnN0IG92ZXJzY2FuID0gMjtcbiAgICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFZpc2libGVDb3VudCA9IE1hdGguY2VpbCg2MDAgLyA1MCk7IC8vIH4xMiBpdGVtc1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBpbml0aWFsU2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcblxuICAgICAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXMoeyBzdGFydCwgZW5kIH0sIFwiaW5pdGlhbC1wb3NpdGlvbi1mYWxsYmFja1wiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGEgKGZhbGxiYWNrKTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGluaXRpYWwgc2Nyb2xsIGluZGV4IC0gbG9hZCBmcm9tIGJlZ2lubmluZyBhcyBub3JtYWxcbiAgICAgICAgbG9hZFJhbmdlKDAsIHJhbmdlU2l6ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYXV0b1NlbGVjdEZpcnN0IC0gZ2V0IGZpcnN0IGl0ZW0gSUQgYW5kIGVtaXQgc2VsZWN0aW9uIGV2ZW50XG4gICAgICAgICAgICBpZiAoYXV0b1NlbGVjdEZpcnN0ICYmIGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SWQgPSBmaXJzdEl0ZW0/Ll9pZCB8fCBmaXJzdEl0ZW0/LmlkO1xuICAgICAgICAgICAgICBpZiAoZmlyc3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdElkOiBmaXJzdElkLFxuICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgZGF0YTpcIiwgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBBUEkgdG8gdmlld3BvcnRcbiAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbiA9IHtcbiAgICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBsb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCksXG4gICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJ2aWV3cG9ydC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IGZhaWxlZFJhbmdlcy5jbGVhcigpLFxuICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiB0b3RhbEl0ZW1zLFxuICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBjdXJzb3JNYXAuZ2V0KHBhZ2UpIHx8IG51bGwsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICB9O1xuXG4gICAgLy8gQWxzbyBlbnN1cmUgY29tcG9uZW50Lml0ZW1zIGlzIHVwZGF0ZWRcbiAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb24gLSBjb21wcmVoZW5zaXZlIG1lbW9yeSBjbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTpiZWZvcmVcIik7XG5cbiAgICAgIC8vIEFib3J0IGFsbCBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBhYm9ydCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHN0cnVjdHVyZXNcbiAgICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmdSYW5nZXMuY2xlYXIoKTtcbiAgICAgIGZhaWxlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlUmVxdWVzdHMuY2xlYXIoKTtcbiAgICAgIGN1cnNvck1hcC5jbGVhcigpO1xuICAgICAgcGFnZVRvT2Zmc2V0TWFwLmNsZWFyKCk7XG5cbiAgICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgICB0b3RhbEl0ZW1zID0gMDtcbiAgICAgIGN1cnJlbnRDdXJzb3IgPSBudWxsO1xuICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgICAgZGlzY292ZXJlZFRvdGFsID0gbnVsbDtcbiAgICAgIGhhc1JlYWNoZWRFbmQgPSBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgY29tcG9uZW50IHJlZmVyZW5jZVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcyA9PT0gaXRlbXMpIHtcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gW107XG4gICAgICB9XG5cbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTphZnRlclwiKTtcbiAgICB9O1xuXG4gICAgLy8gV2lyZSBkZXN0cm95IGludG8gdGhlIGNvbXBvbmVudCdzIGRlc3Ryb3kgY2hhaW5cbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgIC8vIERhdGEgYWNjZXNzIG1ldGhvZHNcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIGdldEl0ZW1zOiAoKSA9PiBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgICAgLy8gTG9hZGluZyBtZXRob2RzXG4gICAgICAgIGxvYWRSYW5nZSxcbiAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwicmV0dXJuLmNvbGxlY3Rpb25cIiksXG4gICAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgICBjbGVhckZhaWxlZFJhbmdlczogKCkgPT4gZmFpbGVkUmFuZ2VzLmNsZWFyKCksXG4gICAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IHRvdGFsSXRlbXMsXG4gICAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgRmVhdHVyZSAtIFNtYXJ0IHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqIEFuYWx5emVzIGZpcnN0IGxvYWRlZCBkYXRhIHRvIGdlbmVyYXRlIHJlYWxpc3RpYyBtYXNrZWQgcGxhY2Vob2xkZXJzXG4gKiBTaG93cyBwbGFjZWhvbGRlcnMgd2hpbGUgZGF0YSBpcyBsb2FkaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwbGFjZWhvbGRlciBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYW5hbHl6ZUZpcnN0TG9hZD86IGJvb2xlYW47XG4gIG1hc2tDaGFyYWN0ZXI/OiBzdHJpbmc7XG4gIHJhbmRvbUxlbmd0aFZhcmlhbmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWVsZCBzdHJ1Y3R1cmUgZm9yIHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqL1xuaW50ZXJmYWNlIEZpZWxkU3RydWN0dXJlIHtcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xuICBhdmdMZW5ndGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbXBvbmVudCB7XG4gIHBsYWNlaG9sZGVyczoge1xuICAgIGFuYWx5emVEYXRhU3RydWN0dXJlOiAoaXRlbXM6IGFueVtdKSA9PiB2b2lkO1xuICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBib29sZWFuO1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gYW55O1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IGFueVtdO1xuICAgIHNob3dQbGFjZWhvbGRlcnM6IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgIGlzUGxhY2Vob2xkZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG4gICAgcmVwbGFjZVBsYWNlaG9sZGVyczogKGl0ZW1zOiBhbnlbXSwgb2Zmc2V0OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBsYWNlaG9sZGVycyhjb25maWc6IFBsYWNlaG9sZGVyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgQ29sbGVjdGlvbkNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBUXG4gICk6IFQgJiBQbGFjZWhvbGRlckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhbmFseXplRmlyc3RMb2FkID0gdHJ1ZSxcbiAgICAgIG1hc2tDaGFyYWN0ZXIgPSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIsXG4gICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUlxuICAgICAgICAuUkFORE9NX0xFTkdUSF9WQVJJQU5DRSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgZmllbGRTdHJ1Y3R1cmVzOiBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgcGxhY2Vob2xkZXJJZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGZpcnN0IGxvYWRlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGFuYWx5emVEYXRhU3RydWN0dXJlID0gKGl0ZW1zOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkIHx8IGhhc0FuYWx5emVkIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYPCflI0gW1BMQUNFSE9MREVSU10gQW5hbHl6aW5nIGRhdGEgc3RydWN0dXJlIGZyb20gJHtpdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgLy8gKTtcblxuICAgICAgY29uc3Qgc3RydWN0dXJlcyA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4oKTtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFYX1NBTVBMRV9TSVpFXG4gICAgICApO1xuXG4gICAgICAvLyBBbmFseXplIGVhY2ggZmllbGQgYWNyb3NzIGFsbCBzYW1wbGUgaXRlbXNcbiAgICAgIGNvbnN0IGZpZWxkU3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcblxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgaW50ZXJuYWwgZmllbGRzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmllbGQuc3RhcnRzV2l0aChcIl9cIikgfHxcbiAgICAgICAgICAgIGZpZWxkID09PSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGl0ZW1bZmllbGRdIHx8IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghZmllbGRTdGF0cy5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZFN0YXRzLnNldChmaWVsZCwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZFN0YXRzLmdldChmaWVsZCkhLnB1c2gobGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBlYWNoIGZpZWxkXG4gICAgICBmaWVsZFN0YXRzLmZvckVhY2goKGxlbmd0aHMsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChsZW5ndGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IE1hdGgubWluKC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5sZW5ndGhzKTtcbiAgICAgICAgY29uc3QgYXZnTGVuZ3RoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBsZW5ndGhzLnJlZHVjZSgoc3VtLCBsZW4pID0+IHN1bSArIGxlbiwgMCkgLyBsZW5ndGhzLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHN0cnVjdHVyZXMuc2V0KGZpZWxkLCB7XG4gICAgICAgICAgbWluTGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aCxcbiAgICAgICAgICBhdmdMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkU3RydWN0dXJlcyA9IHN0cnVjdHVyZXM7XG4gICAgICBoYXNBbmFseXplZCA9IHRydWU7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg4pyFIFtQTEFDRUhPTERFUlNdIFN0cnVjdHVyZSBhbmFseXplZDpgLFxuICAgICAgLy8gICBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcylcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc3RydWN0dXJlLWFuYWx5emVkXCIsIHtcbiAgICAgICAgc3RydWN0dXJlOiBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW5nbGUgcGxhY2Vob2xkZXIgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtID0gKGluZGV4OiBudW1iZXIpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtwbGFjZWhvbGRlcklkQ291bnRlcisrfWAsXG4gICAgICAgIFtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR106IHRydWUsXG4gICAgICAgIF9pbmRleDogaW5kZXgsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZpZWxkU3RydWN0dXJlcyB8fCBmaWVsZFN0cnVjdHVyZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBObyBzdHJ1Y3R1cmUgYW5hbHl6ZWQgeWV0IC0gcmV0dXJuIGJhc2ljIHBsYWNlaG9sZGVyXG4gICAgICAgIHBsYWNlaG9sZGVyLmxhYmVsID0gbWFza0NoYXJhY3Rlci5yZXBlYXQoMTApO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIGZpZWxkcyBiYXNlZCBvbiBhbmFseXplZCBzdHJ1Y3R1cmVcbiAgICAgIGZpZWxkU3RydWN0dXJlcy5mb3JFYWNoKChzdHJ1Y3R1cmUsIGZpZWxkKSA9PiB7XG4gICAgICAgIGxldCBsZW5ndGg6IG51bWJlcjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmFuZG9tTGVuZ3RoVmFyaWFuY2UgJiZcbiAgICAgICAgICBzdHJ1Y3R1cmUubWluTGVuZ3RoICE9PSBzdHJ1Y3R1cmUubWF4TGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFJhbmRvbSBsZW5ndGggd2l0aGluIHJhbmdlXG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKiAoc3RydWN0dXJlLm1heExlbmd0aCAtIHN0cnVjdHVyZS5taW5MZW5ndGggKyAxKSArXG4gICAgICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSBhdmVyYWdlIGxlbmd0aFxuICAgICAgICAgIGxlbmd0aCA9IHN0cnVjdHVyZS5hdmdMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBzb21lIHZhcmlhdGlvbiB0byBtYWtlIGl0IGxvb2sgbW9yZSBuYXR1cmFsXG4gICAgICAgIGlmIChyYW5kb21MZW5ndGhWYXJpYW5jZSAmJiBNYXRoLnJhbmRvbSgpIDwgMC4zKSB7XG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgoMSwgbGVuZ3RoICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMykgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlaG9sZGVyW2ZpZWxkXSA9IG1hc2tDaGFyYWN0ZXIucmVwZWF0KGxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtdWx0aXBsZSBwbGFjZWhvbGRlciBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyA9IChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBhbnlbXSA9PiB7XG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydDsgaSA8PSByYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICBpdGVtcy5wdXNoKGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvdyBwbGFjZWhvbGRlcnMgZm9yIGEgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBzaG93UGxhY2Vob2xkZXJzID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbXMocmFuZ2UpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgYXJyYXlcbiAgICAgIGlmIChjb21wb25lbnQuaXRlbXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHJhbmdlLnN0YXJ0ICsgaTtcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBwbGFjZWhvbGRlcnNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBg8J+UhCBbUExBQ0VIT0xERVJTXSBTaG93aW5nICR7cGxhY2Vob2xkZXJzLmxlbmd0aH0gcGxhY2Vob2xkZXJzIGZvciByYW5nZSAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cGxhY2Vob2xkZXJzLXNob3duXCIsIHtcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGNvdW50OiBwbGFjZWhvbGRlcnMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IGlzUGxhY2Vob2xkZXIgPSAoaXRlbTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpdGVtICYmXG4gICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGl0ZW1bVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLlBMQUNFSE9MREVSX0ZMQUddID09PSB0cnVlXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IHJlcGxhY2VQbGFjZWhvbGRlcnMgPSAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFjb21wb25lbnQuaXRlbXMpIHJldHVybjtcblxuICAgICAgbGV0IHJlcGxhY2VkQ291bnQgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnQuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGN1cnJlbnRJdGVtKSkge1xuICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICByZXBsYWNlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcGxhY2VkQ291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGDinKggW1BMQUNFSE9MREVSU10gUmVwbGFjZWQgJHtyZXBsYWNlZENvdW50fSBwbGFjZWhvbGRlcnMgYXQgb2Zmc2V0ICR7b2Zmc2V0fWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtcmVwbGFjZWRcIiwge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBjb3VudDogcmVwbGFjZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwbGFjZWhvbGRlciBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gbnVsbDtcbiAgICAgIGhhc0FuYWx5emVkID0gZmFsc2U7XG4gICAgICBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgZGF0YSBsb2FkIHRvIGFuYWx5emUgc3RydWN0dXJlXG4gICAgICBpZiAoYW5hbHl6ZUZpcnN0TG9hZCkge1xuICAgICAgICBjb25zdCBoYW5kbGVSYW5nZUxvYWRlZCA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWhhc0FuYWx5emVkICYmIGRhdGEuaXRlbXMgJiYgZGF0YS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXBsYWNlIGFueSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIGRhdGFcbiAgICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzKGRhdGEuaXRlbXMsIGRhdGEub2Zmc2V0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBoYW5kbGVSYW5nZUxvYWRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgaW5pdGlhbCBwbGFjZWhvbGRlcnMgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC5jb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zKCkgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICBjb25zdCBpbml0aWFsUmFuZ2UgPSB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBNYXRoLm1pbihcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkUgLSAxLFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgICBzaG93UGxhY2Vob2xkZXJzKGluaXRpYWxSYW5nZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb25cbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZnVuY3Rpb25zIGZvciB2aWV3cG9ydCB0byBjYWxsXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLl9wbGFjZWhvbGRlcnNJbml0aWFsaXplID0gaW5pdGlhbGl6ZTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0Rlc3Ryb3kgPSBkZXN0cm95O1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBwbGFjZWhvbGRlcnM6IHtcbiAgICAgICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUsXG4gICAgICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBoYXNBbmFseXplZCxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0sXG4gICAgICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyxcbiAgICAgICAgc2hvd1BsYWNlaG9sZGVycyxcbiAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgcmVwbGFjZVBsYWNlaG9sZGVycyxcbiAgICAgICAgY2xlYXIsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8qKlxuICogUmVuZGVyaW5nIEZlYXR1cmUgLSBJdGVtIHJlbmRlcmluZyBhbmQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIERPTSBlbGVtZW50IGNyZWF0aW9uLCBwb3NpdGlvbmluZywgcmVjeWNsaW5nLCBhbmQgdXBkYXRlc1xuICovXG5cbmltcG9ydCB7IGFkZENsYXNzLCByZW1vdmVDbGFzcywgaGFzQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBpc1BsYWNlaG9sZGVyLFxuICBnZXRWaWV3cG9ydFN0YXRlLFxuICB3cmFwSW5pdGlhbGl6ZSxcbiAgd3JhcERlc3Ryb3ksXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tIFwiLi4vLi4vbGF5b3V0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyaW5nQ29uZmlnIHtcbiAgdGVtcGxhdGU/OiAoXG4gICAgaXRlbTogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICkgPT4gc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBtZWFzdXJlSXRlbXM/OiBib29sZWFuO1xuICBlbmFibGVSZWN5Y2xpbmc/OiBib29sZWFuO1xuICBtYXhQb29sU2l6ZT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhSZW5kZXJpbmcgPSAoY29uZmlnOiBSZW5kZXJpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBvdmVyc2NhbiA9IDUsXG4gICAgICBtZWFzdXJlSXRlbXMgPSBmYWxzZSxcbiAgICAgIGVuYWJsZVJlY3ljbGluZyA9IHRydWUsXG4gICAgICBtYXhQb29sU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRU5ERVJJTkcuREVGQVVMVF9NQVhfUE9PTF9TSVpFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgY29uc3QgY29sbGVjdGlvbkl0ZW1zOiBSZWNvcmQ8bnVtYmVyLCBhbnk+ID0ge307XG4gICAgY29uc3QgZWxlbWVudFBvb2w6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCBwb29sU3RhdHMgPSB7IGNyZWF0ZWQ6IDAsIHJlY3ljbGVkOiAwLCBwb29sU2l6ZTogMCwgcmVsZWFzZWQ6IDAgfTtcblxuICAgIC8vIFN0b3JlIGxheW91dCByZXN1bHRzIGZvciBwcm9wZXIgY2xlYW51cCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgY29uc3QgbGF5b3V0UmVzdWx0cyA9IG5ldyBXZWFrTWFwPEhUTUxFbGVtZW50LCB7IGRlc3Ryb3k6ICgpID0+IHZvaWQgfT4oKTtcblxuICAgIC8vIFJldXNhYmxlIHRlbXBsYXRlIGVsZW1lbnQgZm9yIEhUTUwgc3RyaW5nIHBhcnNpbmcgKG1vcmUgZWZmaWNpZW50IHRoYW4gZGl2KVxuICAgIGNvbnN0IHRlbXBsYXRlUGFyc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IFZpZXdwb3J0U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgIGxldCBsYXN0UmVuZGVyVGltZSA9IDA7XG4gICAgbGV0IGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG5cbiAgICAvLyBFbGVtZW50IHBvb2wgbWFuYWdlbWVudFxuICAgIGNvbnN0IGdldFBvb2xlZEVsZW1lbnQgPSAoKTogSFRNTEVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVuYWJsZVJlY3ljbGluZyAmJiBlbGVtZW50UG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCsrO1xuICAgICAgICByZXR1cm4gZWxlbWVudFBvb2wucG9wKCkhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBwb29sU3RhdHMuY3JlYXRlZCsrO1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbGVhc2VFbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICBwb29sU3RhdHMucmVsZWFzZWQrKztcblxuICAgICAgLy8gQ1JJVElDQUw6IENhbGwgZGVzdHJveSBvbiBsYXlvdXRSZXN1bHQgdG8gY2xlYW4gdXAgY29tcG9uZW50cyBhbmQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAvLyBUaGlzIGZpeGVzIHRoZSBtZW1vcnkgbGVhayB3aGVuIHVzaW5nIGxheW91dCB0ZW1wbGF0ZXNcbiAgICAgIGNvbnN0IGxheW91dFJlc3VsdCA9IGxheW91dFJlc3VsdHMuZ2V0KGVsZW1lbnQpO1xuICAgICAgaWYgKGxheW91dFJlc3VsdCAmJiB0eXBlb2YgbGF5b3V0UmVzdWx0LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxheW91dFJlc3VsdC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZGVzdHJveSBlcnJvcnMgLSBlbGVtZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXRSZXN1bHRzLmRlbGV0ZShlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbmFibGVSZWN5Y2xpbmcpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gZWxlbWVudCBmb3IgcmV1c2UgKG5vIGNsb25pbmcgLSByZXVzZSB0aGUgYWN0dWFsIGVsZW1lbnQpXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaW5kZXhcIik7XG4gICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICAvLyBSZW1vdmUgZnJvbSBET00gZmlyc3RcbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG8gcG9vbCBpZiBub3QgZnVsbFxuICAgICAgaWYgKGVsZW1lbnRQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7XG4gICAgICAgIGVsZW1lbnRQb29sLnB1c2goZWxlbWVudCk7XG4gICAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IGVsZW1lbnRQb29sLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIElmIHBvb2wgaXMgZnVsbCwgZWxlbWVudCBpcyBqdXN0IGRlcmVmZXJlbmNlZCBhbmQgR0MnZFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpIGFzIFZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgZnJvbSBjdXJyZW50IHZpcnR1YWwgc2l6ZVxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyICYmIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gdXBkYXRlIHJlcXVlc3RzIGZyb20gQVBJXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCBpdGVtLCBwcmV2aW91c0l0ZW0gfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBpdGVtIGluIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHJlbmRlcmVkXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgY29uc3Qgd2FzVmlzaWJsZSA9ICEhZXhpc3RpbmdFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB1cGRhdGVcbiAgICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSBleGlzdGluZ0VsZW1lbnRcbiAgICAgICAgICA/IGhhc0NsYXNzKFxuICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQsXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MsXG4gICAgICAgICAgICApIHx8IGhhc0NsYXNzKGV4aXN0aW5nRWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIpXG4gICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBpdGVtXG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIENvcHkgcG9zaXRpb24gc3R5bGVzIGZyb20gZXhpc3RpbmcgZWxlbWVudFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUucG9zaXRpb24sXG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogZXhpc3RpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgd2lkdGg6IGV4aXN0aW5nRWxlbWVudC5zdHlsZS53aWR0aCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBzZWxlY3RlZCBzdGF0ZVxuICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MpO1xuICAgICAgICAgICAgICBhZGRDbGFzcyhuZXdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB1cGRhdGUgYW5pbWF0aW9uIGNsYXNzIHRvIGlubmVyIGNvbnRlbnQgZm9yIHZpc2liaWxpdHlcbiAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIC8vIEFsc28gdHJ5IHRvIGFkZCB0byBmaXJzdCBjaGlsZCBpZiBpdCBleGlzdHMgKHRoZSBhY3R1YWwgaXRlbSBjb250ZW50KVxuICAgICAgICAgICAgY29uc3QgaW5uZXJJdGVtID0gbmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgaW4gRE9NXG4gICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpbmRleCwgbmV3RWxlbWVudCk7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFuaW1hdGlvbiBjbGFzcyBhZnRlciB0cmFuc2l0aW9uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgICBpZiAoaW5uZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZWRcIiwge1xuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICAgIHdhc1Zpc2libGUsXG4gICAgICAgICAgd2FzU2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSByZW1vdmUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0gfSA9IGRhdGE7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gdHJ1ZTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdID09PT09PT09PT0gSVRFTSBSRU1PVkUgU1RBUlQgKHY0KSA9PT09PT09PT09YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtSRU5ERVItRklYXSBSZW1vdmluZyBpbmRleDogJHtpbmRleH1gKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBvZiB0cnV0aCAtIGNvbGxlY3Rpb24uaXRlbXMgaGFzIGFscmVhZHkgYmVlbiBzcGxpY2VkIGJ5IGFwaS50c1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbXNTb3VyY2UgPVxuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fFxuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5pdGVtcyB8fFxuICAgICAgICAgIFtdO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zU291cmNlLmxlbmd0aDogJHtjb2xsZWN0aW9uSXRlbXNTb3VyY2UubGVuZ3RofWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zIGNhY2hlIHNpemUgQkVGT1JFOiAke09iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcykubGVuZ3RofWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gU3RyYXRlZ3k6IFNoaWZ0IGNvbGxlY3Rpb25JdGVtcyBjYWNoZSBpbmRpY2VzIGRvd24sIGJ1dCB1c2UgYWN0dWFsIGRhdGFcbiAgICAgICAgLy8gZnJvbSBjb2xsZWN0aW9uLml0ZW1zICh3aGljaCBoYXMgYmVlbiBzcGxpY2VkKSBmb3IgdGhlIGxvYWRlZCByYW5nZS5cbiAgICAgICAgLy8gRm9yIGluZGljZXMgYmV5b25kIHRoZSBsb2FkZWQgcmFuZ2UsIHNoaWZ0IHRoZSBjYWNoZWQgZGF0YS5cblxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKVxuICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgIC5maWx0ZXIoKGspID0+ICFpc05hTihrKSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuXG4gICAgICAgIC8vIERlbGV0ZSB0aGUgcmVtb3ZlZCBpbmRleFxuICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBTaGlmdCBhbGwgaW5kaWNlcyBhZnRlciB0aGUgcmVtb3ZlZCBvbmUgZG93biBieSAxXG4gICAgICAgIC8vIEZvciBpbmRpY2VzIHdpdGhpbiB0aGUgbG9hZGVkIHJhbmdlLCB1c2UgZGF0YSBmcm9tIGNvbGxlY3Rpb24uaXRlbXNcbiAgICAgICAgLy8gRm9yIGluZGljZXMgYmV5b25kLCBzaGlmdCB0aGUgZXhpc3RpbmcgY2FjaGVkIGRhdGFcbiAgICAgICAgY29uc3QgbG9hZGVkTGVuZ3RoID0gY29sbGVjdGlvbkl0ZW1zU291cmNlLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGtleSAtIDE7XG4gICAgICAgICAgICAvLyBJZiBuZXdJbmRleCBpcyB3aXRoaW4gbG9hZGVkIGRhdGEsIHVzZSBzb3VyY2U7IG90aGVyd2lzZSBzaGlmdCBjYWNoZVxuICAgICAgICAgICAgaWYgKG5ld0luZGV4IDwgbG9hZGVkTGVuZ3RoICYmIGNvbGxlY3Rpb25JdGVtc1NvdXJjZVtuZXdJbmRleF0pIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW25ld0luZGV4XSA9IGNvbGxlY3Rpb25JdGVtc1NvdXJjZVtuZXdJbmRleF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBTaGlmdCBjYWNoZWQgZGF0YSBmb3IgaW5kaWNlcyBiZXlvbmQgbG9hZGVkIHJhbmdlXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tuZXdJbmRleF0gPSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbEtleXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpXG4gICAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gIWlzTmFOKGspKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zIGNhY2hlIHNpemUgQUZURVI6ICR7ZmluYWxLZXlzLmxlbmd0aH1gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIGNvbGxlY3Rpb25JdGVtcyBrZXlzOiBbJHtmaW5hbEtleXMuc2xpY2UoMCwgMTApLmpvaW4oXCIsIFwiKX0ke2ZpbmFsS2V5cy5sZW5ndGggPiAxMCA/IFwiLi4uXCIgOiBcIlwifV1gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtczogJHt2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zfWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2U6ICR7SlNPTi5zdHJpbmdpZnkodmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlKX1gLFxuICAgICAgICAvLyApO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBhbnkgdW5kZWZpbmVkL251bGwgdmFsdWVzIGluIGZpcnN0IDMwIGl0ZW1zXG4gICAgICAgIGNvbnN0IGJhZEluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oMzAsIGZpbmFsS2V5cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrID0gZmluYWxLZXlzW2ldO1xuICAgICAgICAgIGlmICghY29sbGVjdGlvbkl0ZW1zW2tdIHx8IGNvbGxlY3Rpb25JdGVtc1trXS5fcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIGJhZEluZGljZXMucHVzaChrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlbmRlcmVkIGVsZW1lbnQgYXQgdGhpcyBpbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcblxuICAgICAgICAvLyBTaGlmdCByZW5kZXJlZCBlbGVtZW50cyBpbmRpY2VzIGRvd25cbiAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgIGlmIChrZXkgPiBpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgZGF0YS1pbmRleCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKGtleSAtIDEpO1xuICAgICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChrZXkgLSAxLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSA8IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbGVtZW50XSBvZiBuZXdSZW5kZXJlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY3JlbWVudCB0b3RhbEl0ZW1zIE5PVyBzbyByZW5kZXJJdGVtcygpIHVzZXMgdGhlIGNvcnJlY3QgY291bnRcbiAgICAgICAgLy8gc2V0VG90YWxJdGVtcygpIHdpbGwgYmUgY2FsbGVkIGxhdGVyIGJ5IHRoZSBBUEksIHdoaWNoIHdpbGwgZW1pdFxuICAgICAgICAvLyB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIGZvciB2aXJ0dWFsIHNpemUgcmVjYWxjdWxhdGlvblxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSAmJiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRvIGZvcmNlIHJlLXJlbmRlclxuICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06cmVtb3ZlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWZ0ZXIgaXRlbSByZW1vdmFsLCBjbGVhciBBTEwgbG9hZGVkUmFuZ2VzIGFuZCBjb2xsZWN0aW9uSXRlbXMgY2FjaGVcbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBjb21wbGV0ZSByZWxvYWQgd2hpY2ggaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0b1xuICAgICAgICAvLyB0cmFjayBzaGlmdGVkIGluZGljZXMuIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGFuZCBhbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHdoYXQgbG9hZGVkUmFuZ2VzIHRoaW5rcyB0aGV5IGFyZS5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aGUgZW50aXJlIGNvbGxlY3Rpb25JdGVtcyBjYWNoZSAtIGl0J3MgYWxsIHN0YWxlIGFmdGVyIHJlbW92YWxcbiAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBpdGVtcyB3ZSBhY3R1YWxseSBoYXZlIGluIHRoZSBzb3VyY2UgYXJyYXlcbiAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGNvbGxlY3Rpb25JdGVtc1NvdXJjZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5cyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcylcbiAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiAhaXNOYU4oaykpO1xuICAgICAgICBjYWNoZUtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA+PSBsb2FkZWRJdGVtc0NvdW50KSB7XG4gICAgICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbG9hZCBvZiB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcbiAgICAgICAgaWYgKHZpc2libGVSYW5nZSAmJiBjb2xsZWN0aW9uPy5sb2FkTWlzc2luZ1Jhbmdlcykge1xuICAgICAgICAgIGNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgICB7IHN0YXJ0OiAwLCBlbmQ6IE1hdGgubWF4KHZpc2libGVSYW5nZS5lbmQsIGxvYWRlZEl0ZW1zQ291bnQpIH0sXG4gICAgICAgICAgICBcIml0ZW0tcmVtb3ZhbFwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlLXJlbmRlclxuICAgICAgICByZW5kZXJJdGVtcygpO1xuICAgICAgICBpc1JlbW92aW5nSXRlbSA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgb3VyIGNhY2hlIHRvb1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOml0ZW1zLWV2aWN0ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtlZXBTdGFydCwga2VlcEVuZCwgZXZpY3RlZENvdW50IH0gPSBkYXRhO1xuICAgICAgICBsZXQgY2xlYW5lZENvdW50ID0gMDtcblxuICAgICAgICAvLyBSZW1vdmUgZXZpY3RlZCBpdGVtcyBmcm9tIG91ciBjYWNoZVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb2xsZWN0aW9uSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGtleSwgMTApO1xuICAgICAgICAgIGlmIChpbmRleCA8IGtlZXBTdGFydCB8fCBpbmRleCA+IGtlZXBFbmQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgY2xlYW5lZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGRhdGEgbG9hZGVkXG4gICAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZCAtIG9mZnNldDogJHtkYXRhLm9mZnNldH0sIGl0ZW1zOiAke2RhdGEuaXRlbXM/Lmxlbmd0aH1gLFxuICAgICAgICAvLyApO1xuICAgICAgICBpZiAoIWRhdGEuaXRlbXM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuYWx5emUgZGF0YSBzdHJ1Y3R1cmUgb24gZmlyc3QgbG9hZFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSAoY29tcG9uZW50IGFzIGFueSkucGxhY2Vob2xkZXJzO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXJzICYmICFwbGFjZWhvbGRlcnMuaGFzQW5hbHl6ZWRTdHJ1Y3R1cmUoKSkge1xuICAgICAgICAgIHBsYWNlaG9sZGVycy5hbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBjb2xsZWN0aW9uIGl0ZW1zIGFuZCByZXBsYWNlIHBsYWNlaG9sZGVyc1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1JFTkRFUi1GSVhdIFVwZGF0aW5nIGNvbGxlY3Rpb25JdGVtcyBmb3IgaW5kaWNlcyAke2RhdGEub2Zmc2V0fSB0byAke2RhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxfWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIGxldCByZXBsYWNlZENvdW50ID0gMDtcbiAgICAgICAgbGV0IHNraXBwZWRDb3VudCA9IDA7XG4gICAgICAgIGRhdGEuaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGRhdGEub2Zmc2V0ICsgaTtcbiAgICAgICAgICBjb25zdCBvbGRJdGVtID0gY29sbGVjdGlvbkl0ZW1zW2luZGV4XTtcbiAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICAgICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXIgaW4gRE9NIGlmIG5lZWRlZFxuICAgICAgICAgIGNvbnN0IHdhc1BsYWNlaG9sZGVyID0gb2xkSXRlbSAmJiBpc1BsYWNlaG9sZGVyKG9sZEl0ZW0pO1xuICAgICAgICAgIGNvbnN0IGhhc0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmhhcyhpbmRleCk7XG4gICAgICAgICAgaWYgKHdhc1BsYWNlaG9sZGVyICYmIGhhc0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzZXMgZnJvbSB3cmFwcGVyXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgICAvLyBBbHNvIHJlbW92ZSBmcm9tIGlubmVyIGVsZW1lbnQgKGZvciBzdHJpbmcgdGVtcGxhdGVzKVxuICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgcmVwbGFjZWQgY2xhc3MgZm9yIGZhZGUtaW4gYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAgIC8vIENvcHkgcG9zaXRpb24gYW5kIHJlcGxhY2VcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZT8ucmVwbGFjZUNoaWxkKG5ld0VsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmVwbGFjZWQgY2xhc3MgYWZ0ZXIgYW5pbWF0aW9uIGNvbXBsZXRlc1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNQbGFjZWhvbGRlciAmJiAhaGFzRWxlbWVudCkge1xuICAgICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgKHJlcGxhY2VkQ291bnQgPiAwIHx8IHNraXBwZWRDb3VudCA+IDApIHtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gUGxhY2Vob2xkZXIgcmVwbGFjZW1lbnQ6ICR7cmVwbGFjZWRDb3VudH0gcmVwbGFjZWQsICR7c2tpcHBlZENvdW50fSBza2lwcGVkIChub3QgcmVuZGVyZWQpYCxcbiAgICAgICAgLy8gICApO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byByZW5kZXJcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlUmFuZ2UgfSA9IHZpZXdwb3J0U3RhdGUgfHwge307XG4gICAgICAgIGlmICh2aXNpYmxlUmFuZ2UpIHtcbiAgICAgICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgPz8gMCAtIDEsXG4gICAgICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRTdGFydCA9IGRhdGEub2Zmc2V0O1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEVuZCA9IGRhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIHBsYWNlaG9sZGVycyBpbiByYW5nZVxuICAgICAgICAgIGNvbnN0IGhhc1BsYWNlaG9sZGVyc0luUmFuZ2UgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgeyBsZW5ndGg6IE1hdGgubWluKGxvYWRlZEVuZCwgcmVuZGVyRW5kKSAtIGxvYWRlZFN0YXJ0ICsgMSB9LFxuICAgICAgICAgICAgKF8sIGkpID0+IGNvbGxlY3Rpb25JdGVtc1tsb2FkZWRTdGFydCArIGldLFxuICAgICAgICAgICkuc29tZSgoaXRlbSkgPT4gaXRlbSAmJiBpc1BsYWNlaG9sZGVyKGl0ZW0pKTtcblxuICAgICAgICAgIGNvbnN0IG5lZWRzUmVuZGVyID1cbiAgICAgICAgICAgIChsb2FkZWRTdGFydCA8PSByZW5kZXJFbmQgJiZcbiAgICAgICAgICAgICAgbG9hZGVkRW5kID49IHJlbmRlclN0YXJ0ICYmXG4gICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMSkgfHxcbiAgICAgICAgICAgIGhhc1BsYWNlaG9sZGVyc0luUmFuZ2U7XG5cbiAgICAgICAgICBpZiAobmVlZHNSZW5kZXIpIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHJlbmRlckl0ZW1zKTtcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgY29udGFpbmVyIGhlaWdodCB3aGVuIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyICYmXG4gICAgICAgICAgZGF0YS50b3RhbFZpcnR1YWxTaXplICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHtkYXRhLnRvdGFsVmlydHVhbFNpemV9cHhgO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFRlbXBsYXRlIGhlbHBlcnNcbiAgICBjb25zdCBnZXREZWZhdWx0VGVtcGxhdGUgPSAoKSA9PiAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBVc2UgbGF5b3V0IHN5c3RlbSBmb3IgZGVmYXVsdCB0ZW1wbGF0ZVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgICBjbGFzczogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gICAgICAgICAgdGV4dDpcbiAgICAgICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgID8gaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IGBJdGVtICR7aW5kZXh9YFxuICAgICAgICAgICAgICA6IFN0cmluZyhpdGVtKSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfTtcblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSB3aXRoIGl0ZW0gZGF0YSBzdWJzdGl0dXRpb25cbiAgICBjb25zdCBwcm9jZXNzTGF5b3V0U2NoZW1hID0gKFxuICAgICAgc2NoZW1hOiBhbnksXG4gICAgICBpdGVtOiBhbnksXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICk6IGFueSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyBIYW5kbGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGxpa2Uge3tuYW1lfX0sIHt7aW5kZXh9fVxuICAgICAgICByZXR1cm4gc2NoZW1hLnJlcGxhY2UoL1xce1xceyhbXn1dKylcXH1cXH0vZywgKG1hdGNoLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImluZGV4XCIpIHJldHVybiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaXRlbVwiKSByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuXG4gICAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBwcm9wZXJ0aWVzIGxpa2Uge3t1c2VyLm5hbWV9fVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0ga2V5LnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG9iajogYW55LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvYmo/Lltwcm9wLnRyaW0oKV07XG4gICAgICAgICAgfSwgaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyh2YWx1ZSkgOiBtYXRjaDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5tYXAoKGNoaWxkKSA9PiBwcm9jZXNzTGF5b3V0U2NoZW1hKGNoaWxkLCBpdGVtLCBpbmRleCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJiBzY2hlbWEgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkOiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgICAgIHByb2Nlc3NlZFtrZXldID0gcHJvY2Vzc0xheW91dFNjaGVtYSh2YWx1ZSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfTtcblxuICAgIC8vIFBvc2l0aW9uIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgY2FsY3VsYXRlSXRlbVBvc2l0aW9uID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgICB0b3RhbEl0ZW1zOiBudW1iZXIsXG4gICAgICBpdGVtU2l6ZTogbnVtYmVyLFxuICAgICAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyLFxuICAgICAgY29udGFpbmVyU2l6ZTogbnVtYmVyLFxuICAgICAgdGFyZ2V0U2Nyb2xsSW5kZXg/OiBudW1iZXIsXG4gICAgKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9XG4gICAgICAgIGFjdHVhbFRvdGFsU2l6ZSA+IHZpcnR1YWxUb3RhbFNpemUgJiYgdmlydHVhbFRvdGFsU2l6ZSA+IDA7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSB0YXJnZXRTY3JvbGxJbmRleCAoZnJvbSBpbml0aWFsU2Nyb2xsSW5kZXgpLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdGVtcyBhcmUgcG9zaXRpb25lZCBjb3JyZWN0bHkgZXZlbiB3aXRoIGNvbXByZXNzaW9uXG4gICAgICBpZiAodGFyZ2V0U2Nyb2xsSW5kZXggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgLy8gUG9zaXRpb24gaXRlbXMgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBpbmRleFxuICAgICAgICAvLyBUaGUgdGFyZ2V0IGluZGV4IHNob3VsZCBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgcmV0dXJuIChpbmRleCAtIHRhcmdldFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzQ29tcHJlc3NlZCB8fCB0b3RhbEl0ZW1zID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpbmRleCAqIGl0ZW1TaXplIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgaGFuZGxpbmdcbiAgICAgIGNvbnN0IG1heFNjcm9sbFBvc2l0aW9uID0gdmlydHVhbFRvdGFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGxQb3NpdGlvbiAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbmVhckJvdHRvbVRocmVzaG9sZCA9IGNvbnRhaW5lclNpemU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tIDw9IG5lYXJCb3R0b21UaHJlc2hvbGQgJiZcbiAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xXG4gICAgICApIHtcbiAgICAgICAgLy8gTmVhciBib3R0b20gaW50ZXJwb2xhdGlvblxuICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBuZWFyQm90dG9tVGhyZXNob2xkKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBib3R0b21Qb3NpdGlvbiA9IChpbmRleCAtIGZpcnN0VmlzaWJsZUF0Qm90dG9tKSAqIGl0ZW1TaXplO1xuICAgICAgICBjb25zdCBub3JtYWxQb3NpdGlvbiA9IChpbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbm9ybWFsUG9zaXRpb24gKyAoYm90dG9tUG9zaXRpb24gLSBub3JtYWxQb3NpdGlvbikgKiBpbnRlcnBvbGF0aW9uXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vcm1hbCBjb21wcmVzc2VkIHNjcm9sbGluZ1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICByZXR1cm4gKGluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgIH07XG5cbiAgICAvLyBSZW5kZXIgc2luZ2xlIGl0ZW1cbiAgICBjb25zdCByZW5kZXJJdGVtID0gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBpdGVtVGVtcGxhdGUgPSB0ZW1wbGF0ZSB8fCBnZXREZWZhdWx0VGVtcGxhdGUoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaXRlbVRlbXBsYXRlKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgbGV0IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHJlc3VsdCBpcyBhIGxheW91dCBzY2hlbWEgKGFycmF5IG9yIG9iamVjdClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVzdWx0KSB8fFxuICAgICAgICAgICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICByZXN1bHQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICEocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBQcm9jZXNzIHNjaGVtYSB0byBzdWJzdGl0dXRlIHZhcmlhYmxlc1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFNjaGVtYSA9IHByb2Nlc3NMYXlvdXRTY2hlbWEocmVzdWx0LCBpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBVc2UgbGF5b3V0IHN5c3RlbSB0byBjcmVhdGUgZWxlbWVudFxuICAgICAgICAgIGNvbnN0IGxheW91dFJlc3VsdCA9IGNyZWF0ZUxheW91dChwcm9jZXNzZWRTY2hlbWEpO1xuICAgICAgICAgIGVsZW1lbnQgPSBsYXlvdXRSZXN1bHQuZWxlbWVudDtcblxuICAgICAgICAgIC8vIElmIHRoZSBsYXlvdXQgY3JlYXRlZCBhIHdyYXBwZXIsIHVzZSBpdCBkaXJlY3RseVxuICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEVsZW1lbnQgaXMgYWxyZWFkeSBjcmVhdGVkIGJ5IGxheW91dCBzeXN0ZW1cbiAgICAgICAgICAgIC8vIFN0b3JlIGxheW91dFJlc3VsdCBmb3IgY2xlYW51cCB3aGVuIGVsZW1lbnQgaXMgcmVsZWFzZWQgKHByZXZlbnRzIG1lbW9yeSBsZWFrKVxuICAgICAgICAgICAgbGF5b3V0UmVzdWx0cy5zZXQoZWxlbWVudCwgbGF5b3V0UmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgaWYgbGF5b3V0IGRpZG4ndCBjcmVhdGUgYSBwcm9wZXIgZWxlbWVudFxuICAgICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmIChsYXlvdXRSZXN1bHQuZWxlbWVudCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGxheW91dFJlc3VsdC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IG9uIHdyYXBwZXIgZWxlbWVudCBmb3IgY2xlYW51cFxuICAgICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgLy8gUGFyc2UgSFRNTCB1c2luZyB0ZW1wbGF0ZSBlbGVtZW50IC0gb3B0aW1pemVkIHBhdGhcbiAgICAgICAgICAvLyBNb3ZlIG5vZGVzIGRpcmVjdGx5IGluc3RlYWQgb2YgY2xvbmluZyAtIG11Y2ggZmFzdGVyLCBubyBtZW1vcnkgb3ZlcmhlYWRcbiAgICAgICAgICB0ZW1wbGF0ZVBhcnNlci5pbm5lckhUTUwgPSByZXN1bHQ7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHRlbXBsYXRlUGFyc2VyLmNvbnRlbnQ7XG5cbiAgICAgICAgICBpZiAoY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZSByb290IGVsZW1lbnQgLSBtb3ZlIGRpcmVjdGx5IChmYXN0ZXIgdGhhbiBjbG9uZU5vZGUpXG4gICAgICAgICAgICBlbGVtZW50ID0gY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbVwiKTtcbiAgICAgICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGl0ZW0pKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE11bHRpcGxlIGNoaWxkcmVuIC0gbW92ZSBhbGwgaW50byBwb29sZWQgZWxlbWVudFxuICAgICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHdoaWxlIChjb250ZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1JlbmRlcmluZ10gSW52YWxpZCB0ZW1wbGF0ZSByZXN1bHQgZm9yIGl0ZW0gJHtpbmRleH1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjbGFzc2VzXG4gICAgICAgIGlmICghaGFzQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpKVxuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwidmlld3BvcnQtaXRlbVwiKTtcbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKGluZGV4KTtcblxuICAgICAgICAvLyBDb3B5IGRhdGEtaWQgZnJvbSBpdGVtIHRvIHZpZXdwb3J0IGVsZW1lbnQgZm9yIHNlbGVjdGlvbiBzdXBwb3J0XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0/Ll9pZCB8fCBpdGVtPy5pZDtcbiAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1JZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pZCA9IFN0cmluZyhpdGVtSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1JlbmRlcmluZ10gRXJyb3IgcmVuZGVyaW5nIGl0ZW0gJHtpbmRleH06YCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHBvc2l0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1Qb3NpdGlvbnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgcmVuZGVyZWRFbGVtZW50cy5zaXplID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGl0ZW1TaXplOiBpdGVtU2l6ZSxcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgY29uc3Qgc29ydGVkSW5kaWNlcyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICk7XG4gICAgICBpZiAoIXNvcnRlZEluZGljZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBzb3J0ZWRJbmRpY2VzWzBdO1xuICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbiA9IDA7XG5cbiAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdmlydHVhbFRvdGFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgICAgICBjb25zdCBmaXJzdFZpc2libGVBdEJvdHRvbSA9IE1hdGgubWF4KDAsIHRvdGFsSXRlbXMgLSBpdGVtc0F0Qm90dG9tKTtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdFNjcm9sbEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gY29udGFpbmVyU2l6ZSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJvdHRvbVBvcyA9IChmaXJzdEluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsUG9zID0gKGZpcnN0SW5kZXggLSBleGFjdFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IG5vcm1hbFBvcyArIChib3R0b21Qb3MgLSBub3JtYWxQb3MpICogaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAoZmlyc3RJbmRleCAtIHNjcm9sbFJhdGlvICogdG90YWxJdGVtcykgKiBpdGVtU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFBvc2l0aW9uID0gZmlyc3RJbmRleCAqIGl0ZW1TaXplIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFBvc2l0aW9uIGVhY2ggaXRlbVxuICAgICAgc29ydGVkSW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtNYXRoLnJvdW5kKFxuICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uLFxuICAgICAgICAgICl9cHgpYDtcblxuICAgICAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGxhc3QgaXRlbXNcbiAgICAgICAgICAvLyBpZiAoaW5kZXggPj0gdG90YWxJdGVtcyAtIDUpIHtcbiAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgICBgW1JlbmRlcmluZ10gTGFzdCBpdGVtIHBvc2l0aW9uZWQ6IGluZGV4PSR7aW5kZXh9LCBwb3NpdGlvbj0ke01hdGgucm91bmQoXG4gICAgICAgICAgLy8gICAgICAgY3VycmVudFBvc2l0aW9uXG4gICAgICAgICAgLy8gICAgICl9cHgsIGl0ZW1TaXplPSR7aXRlbVNpemV9cHgsIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfWBcbiAgICAgICAgICAvLyAgICk7XG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gTWFpbiByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCByZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHZpc2libGVSYW5nZSxcbiAgICAgICAgaXRlbXNDb250YWluZXIsXG4gICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgIGl0ZW1TaXplLFxuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgIH0gPSB2aWV3cG9ydFN0YXRlO1xuXG4gICAgICAvLyBWYWxpZGF0ZSByYW5nZSAtIHNraXAgcmVuZGVyaW5nIGlmIG5vIGl0ZW1zIG9yIHJhbmdlIGlzIGludmFsaWRcbiAgICAgIGlmIChcbiAgICAgICAgIXZpc2libGVSYW5nZSB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDAgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0IDwgMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPj0gdG90YWxJdGVtcyB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kIDwgdmlzaWJsZVJhbmdlLnN0YXJ0IHx8XG4gICAgICAgIGlzTmFOKHZpc2libGVSYW5nZS5zdGFydCkgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLmVuZClcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB0b3RhbEl0ZW1zIGlzIDAsIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50cyB0byByZW1vdmUgc3RhbGUgcGxhY2Vob2xkZXJzXG4gICAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDAgJiYgcmVuZGVyZWRFbGVtZW50cy5zaXplID4gMCkge1xuICAgICAgICAgIEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5lbnRyaWVzKCkpLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgcmFuZ2UgY2hhbmdlZFxuICAgICAgaWYgKFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPT09IGN1cnJlbnRWaXNpYmxlUmFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5lbmQgJiZcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zaXplID4gMFxuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsYXN0UmVuZGVyVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgIGNvbnN0IHJlbmRlckVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4pO1xuXG4gICAgICAvLyBpZiAoaXNSZW1vdmluZ0l0ZW0pIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiB2aXNpYmxlUmFuZ2U9JHtKU09OLnN0cmluZ2lmeSh2aXNpYmxlUmFuZ2UpfSwgb3ZlcnNjYW49JHtvdmVyc2Nhbn0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gcmVuZGVySXRlbXMgY2FsYzogcmVuZGVyU3RhcnQ9JHtyZW5kZXJTdGFydH0sIHJlbmRlckVuZD0ke3JlbmRlckVuZH1gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZW1vdmUgaXRlbXMgb3V0c2lkZSByYW5nZVxuICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSlcbiAgICAgICAgLmZpbHRlcigoW2luZGV4XSkgPT4gaW5kZXggPCByZW5kZXJTdGFydCB8fCBpbmRleCA+IHJlbmRlckVuZClcbiAgICAgICAgLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaXRlbXMgc291cmNlXG4gICAgICBjb25zdCBoYXNDb2xsZWN0aW9uSXRlbXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpLmxlbmd0aCA+IDA7XG4gICAgICBjb25zdCBpdGVtcyA9IGhhc0NvbGxlY3Rpb25JdGVtc1xuICAgICAgICA/IGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICA6IGNvbXBvbmVudC5pdGVtcyB8fCBbXTtcbiAgICAgIGNvbnN0IG1pc3NpbmdJdGVtczogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gUmVuZGVyIGl0ZW1zIGluIHJhbmdlXG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyU3RhcnQ7IGkgPD0gcmVuZGVyRW5kOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxJdGVtcyB8fCByZW5kZXJlZEVsZW1lbnRzLmhhcyhpKSkgY29udGludWU7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgLy8gT25seSBsb2cgZHVyaW5nIHJlbW92YWwgdG8gYXZvaWQgc3BhbSBkdXJpbmcgc2Nyb2xsXG5cbiAgICAgICAgICBtaXNzaW5nSXRlbXMucHVzaChpKTtcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBwbGFjZWhvbGRlclxuICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgICAgaXRlbSA9IHBsYWNlaG9sZGVycz8uZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkgfHwge1xuICAgICAgICAgICAgX3BsYWNlaG9sZGVyOiB0cnVlLFxuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBpZDogYHBsYWNlaG9sZGVyLSR7aX1gLFxuICAgICAgICAgICAgbmFtZTogVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCgxNSksXG4gICAgICAgICAgICB0ZXh0OiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDI1KSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDQwKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbGxlY3Rpb25JdGVtc1tpXSA9IGl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBHZXQgdGFyZ2V0U2Nyb2xsSW5kZXggZnJvbSB2aWV3cG9ydFN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KT8udGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjYWxjdWxhdGVJdGVtUG9zaXRpb24oXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgICAgaXRlbVNpemUsXG4gICAgICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7cG9zaXRpb259cHgpYCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVlc3QgbWlzc2luZyBpdGVtc1xuICAgICAgaWYgKFxuICAgICAgICBtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbmRlcmluZzptaXNzaW5nLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB2aXNpYmxlUmFuZ2U7XG5cbiAgICAgIC8vIExvZyBET00gc3RhdHMgcGVyaW9kaWNhbGx5IChldmVyeSAxMCByZW5kZXJzKVxuICAgICAgaWYgKHBvb2xTdGF0cy5jcmVhdGVkICUgNTAgPT09IDAgJiYgcG9vbFN0YXRzLmNyZWF0ZWQgPiAwKSB7XG4gICAgICAgIGxvZ0RPTVN0YXRzKGByZW5kZXI6JHtwb29sU3RhdHMuY3JlYXRlZH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBpdGVtcyByZW5kZXJlZCBldmVudCB3aXRoIGVsZW1lbnRzIGZvciBzaXplIGNhbGN1bGF0aW9uXG4gICAgICBjb25zdCByZW5kZXJlZEVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMudmFsdWVzKCkpO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIHtcbiAgICAgICAgZWxlbWVudHM6IHJlbmRlcmVkRWxlbWVudHNBcnJheSxcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwge1xuICAgICAgICByYW5nZTogdmlzaWJsZVJhbmdlLFxuICAgICAgICByZW5kZXJlZENvdW50OiByZW5kZXJlZEVsZW1lbnRzLnNpemUsXG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMoKTtcblxuICAgICAgLy8gTG9hZCBkYXRhIGlmIG5vIGl0ZW1zIHJlbmRlcmVkXG4gICAgICBpZiAoXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA9PT0gMCAmJlxuICAgICAgICB0b3RhbEl0ZW1zID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb25cbiAgICAgICkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICB2aXNpYmxlUmFuZ2UsXG4gICAgICAgICAgXCJyZW5kZXJpbmc6bm8taXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVySXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXM7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgcmVuZGVySXRlbXMoKTtcbiAgICAgIG9yaWdpbmFsUmVuZGVySXRlbXM/LigpO1xuICAgIH07XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgd3JhcERlc3Ryb3koY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICAvLyBSZWxlYXNlIGFsbCByZW5kZXJlZCBlbGVtZW50cyAtIHVzZSByZWxlYXNlRWxlbWVudCB0byBwcm9wZXJseSBkZXN0cm95IGxheW91dFJlc3VsdHNcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuXG4gICAgICAvLyBDbGVhciBlbGVtZW50IHBvb2xcbiAgICAgIGVsZW1lbnRQb29sLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIENsZWFyIGNvbGxlY3Rpb24gaXRlbXMgY2FjaGUgLSB0aGlzIGlzIGNyaXRpY2FsIGZvciBtZW1vcnkhXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb2xsZWN0aW9uSXRlbXMpIHtcbiAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVkxpc3QgY29tcG9uZW50IHVzaW5nIGRpcmVjdCB2aWV3cG9ydCBpbnRlZ3JhdGlvblxuICpcbiAqIEBwYXJhbSB7Vkxpc3RDb25maWd9IGNvbmZpZyAtIExpc3QgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Vkxpc3RDb21wb25lbnR9IEEgZnVsbHkgY29uZmlndXJlZCB2aXJ0dWFsIGxpc3QgY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHZsaXN0ID0gY3JlYXRlVkxpc3Qoe1xuICogICBjb250YWluZXI6ICcjbXktbGlzdCcsXG4gKiAgIGNvbGxlY3Rpb246IG15QWRhcHRlcixcbiAqICAgcmFuZ2VTaXplOiAyMCxcbiAqICAgcGFnaW5hdGlvblN0cmF0ZWd5OiAncGFnZScsXG4gKiAgIHRlbXBsYXRlOiAoaXRlbSwgaW5kZXgpID0+IFtcbiAqICAgICB7IGNsYXNzOiAndmlld3BvcnQtaXRlbScsIGF0dHJpYnV0ZXM6IHsgJ2RhdGEtaWQnOiBpdGVtLmlkIH19LFxuICogICAgIFt7IGNsYXNzOiAndmlld3BvcnQtaXRlbV9fbmFtZScsIHRleHQ6IGl0ZW0ubmFtZSB9XSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX3ZhbHVlJywgdGV4dDogaXRlbS52YWx1ZSB9XVxuICogICBdXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVkxpc3QgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4gPSB7fSxcbik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBjb25zb2xlLmxvZyhg8J+TiyBDcmVhdGluZyBWTGlzdCBjb21wb25lbnQgd2l0aCBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25gKTtcblxuICAgIC8vIE5vdGU6IFRyYW5zZm9ybSBzaG91bGQgYmUgYXBwbGllZCBieSB0aGUgY29sbGVjdGlvbiBmZWF0dXJlIGluIHZpZXdwb3J0XG4gICAgLy8gVkxpc3Qgc2hvdWxkIG5vdCBpbnRlcmNlcHQgY29sbGVjdGlvbiByZWFkcyBhcyBpdCBieXBhc3NlcyB0aGUgbG9hZGluZyBtYW5hZ2VyXG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCB0aHJvdWdoIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAgICBjb25zdCBlbmhhbmNlcnMgPSBbXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyXG4gICAgICBjcmVhdGVCYXNlLFxuICAgICAgd2l0aEV2ZW50cygpLFxuICAgICAgd2l0aEVsZW1lbnQoe1xuICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgIGNsYXNzTmFtZTogY29uZmlnLmNsYXNzTmFtZSB8fCBcIm10cmwtdmxpc3RcIixcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIHJvbGU6IFwibGlzdFwiLFxuICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBjb25maWcuYXJpYUxhYmVsIHx8IFwiVmlydHVhbCBMaXN0XCIsXG4gICAgICAgIH0sXG4gICAgICB9KSxcblxuICAgICAgLy8gMi4gVmlld3BvcnQgaW50ZWdyYXRpb25cbiAgICAgIC8vIFBhc3MgYXV0b1NlbGVjdEZpcnN0IGZyb20gc2VsZWN0aW9uIGNvbmZpZyB0byB2aWV3cG9ydCBsZXZlbFxuICAgICAgd2l0aFZpZXdwb3J0KHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICBhdXRvU2VsZWN0Rmlyc3Q6IGNvbmZpZy5zZWxlY3Rpb24/LmF1dG9TZWxlY3RGaXJzdCxcbiAgICAgIH0pLFxuXG4gICAgICAvLyAzLiBDb21wb25lbnQgbGlmZWN5Y2xlXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG5cbiAgICAgIC8vIDQuIFB1YmxpYyBBUEkgbGF5ZXJcbiAgICAgIHdpdGhBUEkoY29uZmlnKSxcbiAgICBdO1xuXG4gICAgLy8gNC41LiBTZWxlY3Rpb24gY2FwYWJpbGl0aWVzIChpZiBlbmFibGVkKSAtIG11c3QgYmUgYWZ0ZXIgQVBJXG4gICAgaWYgKGNvbmZpZy5zZWxlY3Rpb24/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhTZWxlY3Rpb24oY29uZmlnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50ID0gcGlwZSguLi5lbmhhbmNlcnMpKHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbXBvbmVudE5hbWU6IFwidmxpc3RcIixcbiAgICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIixcbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgVkxpc3RDb21wb25lbnQ8VD47XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIuKdjCBbVkxJU1RdIEZhaWxlZCB0byBjcmVhdGUgVkxpc3QgY29tcG9uZW50OlwiLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzXG5cbi8qKlxuICogVmlld3BvcnQgZmVhdHVyZSBmb3IgVkxpc3RcbiAqIEludGVncmF0ZXMgdGhlIGNvcmUgdmlld3BvcnQgZnVuY3Rpb25hbGl0eSB3aXRoIFZMaXN0IGNvbXBvbmVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0SXRlbSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlVmlld3BvcnQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS92aWV3cG9ydFwiO1xuXG4vKipcbiAqIEFkZHMgdmlld3BvcnQgZnVuY3Rpb25hbGl0eSB0byBWTGlzdFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpZXdwb3J0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBhbnkpID0+IHtcbiAgICAvLyBTZXQgaW5pdGlhbCBpdGVtcyBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcuaXRlbXMpIHtcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGNvbmZpZy5pdGVtcztcbiAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gY29uZmlnLml0ZW1zLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGVtcGxhdGUgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLnRlbXBsYXRlKSB7XG4gICAgICBjb21wb25lbnQudGVtcGxhdGUgPSBjb25maWcudGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoZSBlbGVtZW50IGhhcyBib3RoIHZsaXN0IGFuZCB2aWV3cG9ydCBjbGFzc2VzXG4gICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjbGFzc05hbWU6IFwibXRybC12aWV3cG9ydFwiLCAvLyBUaGlzIHdpbGwgYmUgYWRkZWQgYnkgdmlld3BvcnQgYmFzZSBmZWF0dXJlXG4gICAgfTtcblxuICAgIC8vIFBhc3MgVkxpc3QgY29uZmlnIGRpcmVjdGx5IHRvIHZpZXdwb3J0XG4gICAgY29uc3Qgdmlld3BvcnRFbmhhbmNlZCA9IGNyZWF0ZVZpZXdwb3J0KHZpZXdwb3J0Q29uZmlnIGFzIGFueSkoY29tcG9uZW50KTtcblxuICAgIC8vIEhhbmRsZSBwYXJlbnQgZWxlbWVudCBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcucGFyZW50IHx8IGNvbmZpZy5jb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcjtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICB0eXBlb2YgY29udGFpbmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcilcbiAgICAgICAgICA6IGNvbnRhaW5lcjtcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgdmlld3BvcnRFbmhhbmNlZC5lbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodmlld3BvcnRFbmhhbmNlZC5lbGVtZW50KTtcblxuICAgICAgICAvLyBFbnN1cmUgdmlld3BvcnQgaXMgaW5pdGlhbGl6ZWQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcbiAgICAgICAgaWYgKHZpZXdwb3J0RW5oYW5jZWQudmlld3BvcnQgJiYgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCLwn5OLIFtWTGlzdF0gSW5pdGlhbGl6aW5nIHZpZXdwb3J0IGFmdGVyIERPTSBhdHRhY2htZW50XCIpO1xuICAgICAgICAgIHZpZXdwb3J0RW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpZXdwb3J0RW5oYW5jZWQ7XG4gIH07XG59O1xuIiwKICAgICIvKipcbiAqIEFQSSBmZWF0dXJlIGZvciBWTGlzdFxuICogUHJvdmlkZXMgYSBjbGVhbiBwdWJsaWMgQVBJIGZvciB0aGUgVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtLCBSZW1vdmVJdGVtT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vLyBSZS1leHBvcnQgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCB3aXRoQVBJID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBhbnkpID0+IHtcbiAgICAvLyBJbml0aWFsaXplIHZpZXdwb3J0IG9uIGNyZWF0aW9uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0ICYmIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG5cbiAgICAvLyBUcmFjayBsb2FkaW5nIHN0YXRlXG4gICAgbGV0IGlzTG9hZGluZyA9IGZhbHNlO1xuICAgIGxldCBzZWxlY3RlZElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gVHJhY2sgcGVuZGluZyByZW1vdmFscyB0byBmaWx0ZXIgb3V0IGl0ZW1zIGZyb20gc3RhbGUgc2VydmVyIHJlc3BvbnNlc1xuICAgIC8vIFRoaXMgcHJldmVudHMgcmFjZSBjb25kaXRpb25zIHdoZXJlIHNlcnZlciByZXR1cm5zIG9sZCBkYXRhIGJlZm9yZSB1cGRhdGVzIGFyZSBjb21taXR0ZWRcbiAgICBjb25zdCBwZW5kaW5nUmVtb3ZhbHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBldmVudHNcbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsICgpID0+IHtcbiAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1mYWlsZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBEYXRhIG9wZXJhdGlvbnNcbiAgICAgIHNldEl0ZW1zKGl0ZW1zOiBUW10pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldEl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6c2V0XCIsIHsgaXRlbXMsIHRvdGFsOiBpdGVtcy5sZW5ndGggfSk7XG4gICAgICB9LFxuXG4gICAgICBnZXRJdGVtcygpOiBUW10ge1xuICAgICAgICAvLyBDb2xsZWN0aW9uIGlzIGFkZGVkIGRpcmVjdGx5IHRvIGNvbXBvbmVudCwgbm90IHRvIHZpZXdwb3J0LmNvbGxlY3Rpb25cbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtcykge1xuICAgICAgICAgIHJldHVybiAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5nZXRJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuaXRlbXMgfHwgW107XG4gICAgICB9LFxuXG4gICAgICBnZXRWaXNpYmxlSXRlbXMoKTogVFtdIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZSgpIHx8IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICB9LFxuXG4gICAgICBnZXRJdGVtQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IGNvbXBvbmVudC5pdGVtcz8ubGVuZ3RoIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXRyaWV2ZVxuICAgICAgICogQHJldHVybnMgVGhlIGl0ZW0gYXQgdGhlIGluZGV4LCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAgICAgKi9cbiAgICAgIGdldEl0ZW0oaW5kZXg6IG51bWJlcik6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/LmdldEl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbShpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIHJldHVybiBpdGVtc1tpbmRleF07XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIG5ldyBpdGVtIGRhdGEgKGZ1bGwgcmVwbGFjZW1lbnQpXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZUl0ZW0oaW5kZXg6IG51bWJlciwgaXRlbTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSB1cGRhdGVJdGVtOiBpbmRleCAke2luZGV4fSBvdXQgb2YgYm91bmRzYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIGZlYXR1cmUgdG8gaGFuZGxlIERPTSB1cGRhdGVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlIGl0ZW0gYnkgSURcbiAgICAgICAqIEZpbmRzIHRoZSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBJRCBhbmQgdXBkYXRlcyBpdCB3aXRoIG5ldyBkYXRhXG4gICAgICAgKiBSZS1yZW5kZXJzIHRoZSBpdGVtIGlmIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZFxuICAgICAgICogQHBhcmFtIGRhdGEgLSBQYXJ0aWFsIGRhdGEgdG8gbWVyZ2Ugd2l0aCBleGlzdGluZyBpdGVtLCBvciBmdWxsIGl0ZW0gcmVwbGFjZW1lbnRcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVXBkYXRlIG9wdGlvbnNcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXRlbSB3YXMgZm91bmQgYW5kIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtQnlJZChcbiAgICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgZGF0YTogUGFydGlhbDxUPixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC8qKiBJZiB0cnVlLCByZXBsYWNlIHRoZSBlbnRpcmUgaXRlbSBpbnN0ZWFkIG9mIG1lcmdpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIHJlcGxhY2U/OiBib29sZWFuO1xuICAgICAgICAgIC8qKiBJZiB0cnVlLCByZS1yZW5kZXIgZXZlbiBpZiBub3QgdmlzaWJsZSAoZGVmYXVsdDogZmFsc2UpICovXG4gICAgICAgICAgZm9yY2VSZW5kZXI/OiBib29sZWFuO1xuICAgICAgICB9ID0ge30sXG4gICAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGl0ZW0gYnkgSUQgKGhhbmRsZSBzcGFyc2UgYXJyYXlzIGZyb20gcGFnaW5hdGlvbilcbiAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyBzaW5jZSBpdGVtcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSUQgc3RydWN0dXJlc1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyAtIHVzZXJfaWQgaXMgaW1wb3J0YW50IGZvciBwcm9maWxlL2NvbnRhY3QgaXRlbXNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbUJ5SWQ6IGl0ZW0gd2l0aCBpZCAke2lkfSBub3QgZm91bmRgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gQ3JlYXRlIHVwZGF0ZWQgaXRlbSAtIGVpdGhlciByZXBsYWNlIGVudGlyZWx5IG9yIG1lcmdlXG4gICAgICAgIGxldCB1cGRhdGVkSXRlbTogVDtcbiAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4uZGF0YSwgaWQ6IHByZXZpb3VzSXRlbS5pZCA/PyBpZCB9IGFzIFQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT25seSBtZXJnZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhY3R1YWwgdmFsdWVzIChub3QgdW5kZWZpbmVkKVxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgcGFydGlhbCB1cGRhdGVzIGZyb20gb3ZlcndyaXRpbmcgZXhpc3RpbmcgZGF0YVxuICAgICAgICAgIHVwZGF0ZWRJdGVtID0geyAuLi5wcmV2aW91c0l0ZW0gfSBhcyBUO1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAodXBkYXRlZEl0ZW0gYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGluIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXlcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLml0ZW1zW2luZGV4XSA9IHVwZGF0ZWRJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIGZlYXR1cmUgdG8gaGFuZGxlIERPTSB1cGRhdGVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW06IHVwZGF0ZWRJdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgY29sbGVjdGlvbiwgdXBkYXRlcyB0b3RhbEl0ZW1zLCBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyXG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlSXRlbShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gcmVtb3ZlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXkgKGNvbXBvbmVudC5jb2xsZWN0aW9uLml0ZW1zIGlzIHRoZSBhY3R1YWwgYXJyYXkpXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSU1QT1JUQU5UOiBFbWl0IGl0ZW06cmVtb3ZlLXJlcXVlc3QgRklSU1Qgc28gcmVuZGVyaW5nIGZlYXR1cmUgcmVidWlsZHMgY29sbGVjdGlvbkl0ZW1zXG4gICAgICAgIC8vIEJFRk9SRSBzZXRUb3RhbEl0ZW1zIHRyaWdnZXJzIGEgcmVuZGVyIHZpYSB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiByZW1vdmVkSXRlbSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHdpbGwgdHJpZ2dlciB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIHdoaWNoIGNhbGxzIHJlbmRlckl0ZW1zXG4gICAgICAgIC8vIEJ5IG5vdywgY29sbGVjdGlvbkl0ZW1zIGhhcyBiZWVuIHJlYnVpbHQgYnkgdGhlIGl0ZW06cmVtb3ZlLXJlcXVlc3QgaGFuZGxlclxuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0VG90YWxJdGVtcyAmJiBjb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byB2aWV3cG9ydC5jb2xsZWN0aW9uIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKFxuICAgICAgICAgICAgTWF0aC5tYXgoMCwgY3VycmVudFRvdGFsIC0gMSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMYXN0IHJlc29ydDogdXBkYXRlIGNvbXBvbmVudC50b3RhbEl0ZW1zIGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gTWF0aC5tYXgoMCwgY29tcG9uZW50LnRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGl0ZW0gYnkgSURcbiAgICAgICAqIEZpbmRzIHRoZSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBJRCBhbmQgcmVtb3ZlcyBpdFxuICAgICAgICogVXBkYXRlcyB0b3RhbEl0ZW1zIGFuZCB0cmlnZ2VycyByZS1yZW5kZXIgb2YgdmlzaWJsZSBpdGVtc1xuICAgICAgICogT3B0aW9uYWxseSB0cmFja3MgYXMgcGVuZGluZyByZW1vdmFsIHRvIGZpbHRlciBmcm9tIGZ1dHVyZSBmZXRjaGVzXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBmaW5kIGFuZCByZW1vdmVcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gUmVtb3ZlIG9wdGlvbnMgKHRyYWNrUGVuZGluZywgcGVuZGluZ1RpbWVvdXQpXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIG9wdGlvbnM6IFJlbW92ZUl0ZW1PcHRpb25zID0ge30sXG4gICAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyB0cmFja1BlbmRpbmcgPSB0cnVlLCBwZW5kaW5nVGltZW91dCA9IDUwMDAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gcmVtb3ZlSXRlbUJ5SWQ6IGludmFsaWQgaWRgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdG8gcGVuZGluZyByZW1vdmFscyB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgc2VydmVyIHJlc3BvbnNlc1xuICAgICAgICBpZiAodHJhY2tQZW5kaW5nKSB7XG4gICAgICAgICAgcGVuZGluZ1JlbW92YWxzLmFkZChpZCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHMgYWZ0ZXIgdGltZW91dCAoc2VydmVyIHNob3VsZCBoYXZlIHVwZGF0ZWQgYnkgdGhlbilcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgICAgIH0sIHBlbmRpbmdUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGl0ZW0gYnkgSUQgKGhhbmRsZSBzcGFyc2UgYXJyYXlzIGZyb20gcGFnaW5hdGlvbilcbiAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyBzaW5jZSBpdGVtcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSUQgc3RydWN0dXJlc1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkc1xuICAgICAgICAgIGNvbnN0IGlkc1RvQ2hlY2sgPSBbaXRlbS5pZCwgaXRlbS5faWQsIGl0ZW0udXNlcl9pZF0uZmlsdGVyKFxuICAgICAgICAgICAgKHYpID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGlkc1RvQ2hlY2suc29tZShcbiAgICAgICAgICAgIChpdGVtSWQpID0+IGl0ZW1JZCA9PT0gaWQgfHwgU3RyaW5nKGl0ZW1JZCkgPT09IFN0cmluZyhpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUl0ZW0oaW5kZXgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhbiBpdGVtIElEIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gY2hlY2tcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGl0ZW0gaXMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKi9cbiAgICAgIGlzUGVuZGluZ1JlbW92YWwoaWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcGVuZGluZ1JlbW92YWxzLmhhcyhpZCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgcGVuZGluZyByZW1vdmFsIElEc1xuICAgICAgICogQHJldHVybnMgU2V0IG9mIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqL1xuICAgICAgZ2V0UGVuZGluZ1JlbW92YWxzKCk6IFNldDxzdHJpbmcgfCBudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQocGVuZGluZ1JlbW92YWxzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYSBzcGVjaWZpYyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNsZWFyIGZyb20gcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhclBlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmRlbGV0ZShpZCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBwZW5kaW5nIHJlbW92YWxzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyQWxsUGVuZGluZ1JlbW92YWxzKCk6IHZvaWQge1xuICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuY2xlYXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRmlsdGVyIGl0ZW1zIGFycmF5IHRvIGV4Y2x1ZGUgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICogVXRpbGl0eSBtZXRob2QgZm9yIHVzZSBpbiBjb2xsZWN0aW9uIGFkYXB0ZXJzXG4gICAgICAgKiBAcGFyYW0gaXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBmaWx0ZXJcbiAgICAgICAqIEByZXR1cm5zIEZpbHRlcmVkIGFycmF5IHdpdGhvdXQgcGVuZGluZyByZW1vdmFsIGl0ZW1zXG4gICAgICAgKi9cbiAgICAgIGZpbHRlclBlbmRpbmdSZW1vdmFsczxJIGV4dGVuZHMgeyBpZD86IGFueTsgX2lkPzogYW55IH0+KFxuICAgICAgICBpdGVtczogSVtdLFxuICAgICAgKTogSVtdIHtcbiAgICAgICAgaWYgKHBlbmRpbmdSZW1vdmFscy5zaXplID09PSAwKSByZXR1cm4gaXRlbXM7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gaXRlbS5faWQgfHwgaXRlbS5pZDtcbiAgICAgICAgICByZXR1cm4gIXBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExvYWRpbmcgb3BlcmF0aW9uc1xuICAgICAgYXN5bmMgbG9hZFJhbmdlKFxuICAgICAgICBwYWdlOiBudW1iZXIsXG4gICAgICAgIGxpbWl0OiBudW1iZXIsXG4gICAgICAgIHN0cmF0ZWd5OiBzdHJpbmcgPSBcInBhZ2VcIixcbiAgICAgICAgYWxpZ25tZW50Pzogc3RyaW5nLFxuICAgICAgKSB7XG4gICAgICAgIGlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHN0cmF0ZWd5ID09PSBcInBhZ2VcIiA/IChwYWdlIC0gMSkgKiBsaW1pdCA6IHBhZ2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRSYW5nZShvZmZzZXQsIGxpbWl0KTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJsb2FkXCIsIHsgcGFnZSwgbGltaXQsIHN0cmF0ZWd5IH0pO1xuXG4gICAgICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIGxvYWRlZCByYW5nZSBpZiBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkXG4gICAgICAgICAgICBpZiAoYWxpZ25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJlcnJvclwiLCB7IGVycm9yIH0pO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gRGF0YSBsb2FkaW5nXG4gICAgICBsb2FkTmV4dDogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZMaXN0XSBsb2FkTmV4dCgpYCk7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IHVubG9hZGVkIHJhbmdlXG4gICAgICAgICAgbGV0IG5leHRPZmZzZXQgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3QgcmFuZ2VJZCBvZiBsb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRW5kID0gKHJhbmdlSWQgKyAxKSAqIChjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjApO1xuICAgICAgICAgICAgaWYgKHJhbmdlRW5kID4gbmV4dE9mZnNldCkge1xuICAgICAgICAgICAgICBuZXh0T2Zmc2V0ID0gcmFuZ2VFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5leHRPZmZzZXQgPCB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2UoXG4gICAgICAgICAgICAgIG5leHRPZmZzZXQsXG4gICAgICAgICAgICAgIGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCB8fCAyMCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNMb2FkaW5nO1xuICAgICAgfSxcblxuICAgICAgaGFzTmV4dCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHRvdGFsID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgICByZXR1cm4gaXRlbXMubGVuZ3RoIDwgdG90YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLy8gTm90ZTogU2VsZWN0aW9uIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlIHdpdGhTZWxlY3Rpb24gZmVhdHVyZVxuICAgICAgLy8gVGhlc2UgYXJlIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IGRlbGVnYXRlIHRvIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgZ2V0U2VsZWN0ZWRJZHMoKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBjb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgICAgcmV0dXJuIGluZGljZXMubWFwKChpZHg6IG51bWJlcikgPT4gKGl0ZW1zW2lkeF0gYXMgYW55KT8uaWQgfHwgaWR4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShzZWxlY3RlZElkcyk7XG4gICAgICB9LFxuXG4gICAgICBzZWxlY3RJdGVtKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuc2VsZWN0SXRlbXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRlc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmRlc2VsZWN0SXRlbXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICAgIHNlbGVjdGVkSWRzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmNsZWFyU2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29tcG9uZW50LmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHsgc2VsZWN0ZWQ6IFtdIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBTY3JvbGxpbmcgbWV0aG9kc1xuICAgICAgc2Nyb2xsVG9JbmRleDogKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgdG8gaW5kZXggYW5kIHNlbGVjdCBpdGVtIGFmdGVyIGRhdGEgbG9hZHNcbiAgICAgICAqIFVzZWZ1bCBmb3IgcnVudGltZSBzY3JvbGwrc2VsZWN0IHdoZW4gVkxpc3QgaXMgYWxyZWFkeSBjcmVhdGVkXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbFRvSW5kZXhBbmRTZWxlY3Q6IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIHJhbmdlIGxvYWQgdG8gY29tcGxldGUsIHRoZW4gc2VsZWN0XG4gICAgICAgIGNvbnN0IG9uUmFuZ2VMb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LnNlbGVjdEJ5SWQpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LnNlbGVjdEJ5SWQoc2VsZWN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnNlbGVjdEJ5SWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDMwMCk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9JdGVtOiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGl0ZW1JZDogc3RyaW5nLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoXG4gICAgICAgICAgKGl0ZW06IGFueSkgPT4gU3RyaW5nKGl0ZW0uaWQpID09PSBTdHJpbmcoaXRlbUlkKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCwgYW5pbWF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLndhcm4oYEl0ZW0gJHtpdGVtSWR9IG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KDAsIFwic3RhcnRcIik7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb0JvdHRvbTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdGhpcy5nZXRJdGVtQ291bnQoKTtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCh0b3RhbEl0ZW1zIC0gMSwgXCJlbmRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9QYWdlOiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIHBhZ2VOdW06IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtWTGlzdF0gc2Nyb2xsVG9QYWdlKCR7cGFnZU51bX0pYCk7XG5cbiAgICAgICAgLy8gR2V0IGxpbWl0IGZyb20gY29uZmlnIChyYW5nZVNpemUpIG9yIGRlZmF1bHRcbiAgICAgICAgY29uc3QgbGltaXQgPSBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjA7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gY3Vyc29yIG1vZGVcbiAgICAgICAgaWYgKGNvbmZpZy5wYWdpbmF0aW9uPy5zdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB3ZSBuZWVkIHRvIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgICAgY29uc3QgaGlnaGVzdExvYWRlZFBhZ2UgPSBsb2FkZWRSYW5nZXMuc2l6ZTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPiBoaWdoZXN0TG9hZGVkUGFnZSArIDEpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGBbVkxpc3RdIENhbm5vdCBqdW1wIHRvIHBhZ2UgJHtwYWdlTnVtfSBpbiBjdXJzb3IgbW9kZS4gYCArXG4gICAgICAgICAgICAgICAgICBgTG9hZGluZyBwYWdlcyBzZXF1ZW50aWFsbHkgZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgICAgICAgIH0gdG8gJHtwYWdlTnVtfWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHZpZXdwb3J0J3Mgc2Nyb2xsVG9QYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5zY3JvbGxUb1BhZ2UpIHtcbiAgICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9QYWdlKHBhZ2VOdW0sIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHNjcm9sbFRvSW5kZXhcbiAgICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IChwYWdlTnVtIC0gMSkgKiBsaW1pdDtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbFRvSW5kZXgodGFyZ2V0SW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcbiAgICAgIH0sXG5cbiAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24/LmdldEN1cnJlbnRDdXJzb3I/LigpIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICBzZXRTY3JvbGxBbmltYXRpb24oZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICAvLyBTdG9yZSBhbmltYXRpb24gcHJlZmVyZW5jZSAod291bGQgYmUgdXNlZCBieSB2aWV3cG9ydCBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgICAgY29tcG9uZW50LnNjcm9sbEFuaW1hdGlvbiA9IGVuYWJsZWQ7XG4gICAgICB9LFxuXG4gICAgICAvLyBTdGF0ZVxuICAgICAgZ2V0U3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXRlbXM6IHRoaXMuZ2V0SXRlbXMoKSxcbiAgICAgICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb25cbiAgICAgICAgICAgID8gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpXG4gICAgICAgICAgICA6IGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgICAgdmlzaWJsZVJhbmdlOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZSgpIHx8IHtcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgICAgIHNlbGVjdGVkSWRzOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZygpLFxuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgLy8gTGlmZWN5Y2xlXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5kZXN0cm95KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZGVzdHJveWVkXCIpO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBtdHJsLWFkZG9ucyBMaXN0IENvbXBvbmVudCBDb25zdGFudHNcbiAqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBhZGRvbnMgbGlzdCBjb21wb25lbnQuXG4gKiBOb3RlOiBCYXNlIG10cmwgbGlzdCBmdW5jdGlvbmFsaXR5IGlzIGhhbmRsZWQgYnkgbXRybCBjb3JlLlxuICogVGhlc2UgY29uc3RhbnRzIGFyZSBmb3IgYWRkb25zLXNwZWNpZmljIGZlYXR1cmVzIG9ubHkuXG4gKi9cblxuLyoqXG4gKiBDU1MgY2xhc3MgbmFtZXMgZm9yIFZMaXN0IGNvbXBvbmVudFxuICogRm9sbG93aW5nIEJFTSBjb252ZW50aW9uOiBjb21wb25lbnRfX2VsZW1lbnQtLW1vZGlmaWVyXG4gKiBOb3RlOiBtdHJsIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvcmUgRE9NIGNsYXNzZXMgc3lzdGVtXG4gKi9cbmV4cG9ydCBjb25zdCBWTElTVF9DTEFTU0VTID0ge1xuICAvKiogTGlzdCBlbGVtZW50ICovXG4gIExJU1Q6IFwidmxpc3RcIixcbiAgLyoqIExpc3QgaXRlbSAqL1xuICBJVEVNOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgLyoqIFNlbGVjdGVkIGxpc3QgaXRlbSAqL1xuICBTRUxFQ1RFRDogXCJ2aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiLFxuICAvKiogRW1wdHkgc3RhdGUgKi9cbiAgRU1QVFk6IFwidmxpc3QtLWVtcHR5XCIsXG59IGFzIGNvbnN0O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy92bGlzdC9mZWF0dXJlcy9zZWxlY3Rpb24udHNcblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RDb21wb25lbnQsIFZMaXN0SXRlbSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVkxJU1RfQ0xBU1NFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBTZWxlY3Rpb24gc3RhdGUgaW50ZXJmYWNlXG4gKi9cbmludGVyZmFjZSBTZWxlY3Rpb25TdGF0ZSB7XG4gIHNlbGVjdGVkSWRzOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPjtcbiAgbW9kZTogXCJub25lXCIgfCBcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwiO1xuICBsYXN0U2VsZWN0ZWRJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgaXRlbSBJRCBmcm9tIGVsZW1lbnQgb3IgaXRlbSBkYXRhXG4gKi9cbmNvbnN0IGdldEl0ZW1JZCA9IChpdGVtOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoaXRlbT8uaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGl0ZW0uaWQ7XG4gIGlmIChpdGVtPy5faWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGl0ZW0uX2lkO1xuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHJldHVybiBpdGVtO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBBZGRzIHNlbGVjdGlvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byBWTGlzdCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTZWxlY3Rpb24gPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IFZMaXN0Q29tcG9uZW50PFQ+KTogVkxpc3RDb21wb25lbnQ8VD4gPT4ge1xuICAgIGlmICghY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm5vbmVcIikge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZTogU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgICBzZWxlY3RlZElkczogbmV3IFNldCgpLFxuICAgICAgbW9kZTogY29uZmlnLnNlbGVjdGlvbj8ubW9kZSB8fCBcInNpbmdsZVwiLFxuICAgICAgbGFzdFNlbGVjdGVkSW5kZXg6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVxdWlyZU1vZGlmaWVycyA9IGNvbmZpZy5zZWxlY3Rpb24/LnJlcXVpcmVNb2RpZmllcnMgPz8gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBzZWxlY3Rpb24gY2xhc3MgdG8gcmVuZGVyZWQgZWxlbWVudHMgbWF0Y2hpbmcgc2VsZWN0ZWQgSURzXG4gICAgICovXG4gICAgY29uc3QgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1zYCxcbiAgICAgICk7XG4gICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpdGVtcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaWRdYCxcbiAgICAgICk7XG5cbiAgICAgIGl0ZW1zLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmRhdGFzZXQuaWQ7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgYm90aCBzdHJpbmcgYW5kIG51bWJlciB2ZXJzaW9ucyBvZiB0aGUgSURcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID1cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkgfHwgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKE51bWJlcihpZCkpO1xuICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWTElTVF9DTEFTU0VTLlNFTEVDVEVEKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGl0ZW0gY2xpY2sgZm9yIHNlbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUl0ZW1DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB2aWV3cG9ydEl0ZW0gPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICghdmlld3BvcnRJdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQodmlld3BvcnRJdGVtLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiKTtcbiAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCk7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXM/LltpbmRleF07XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW1JZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGl0ZW1JZCk7XG5cbiAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIGlmICghd2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAoIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VJdGVtID0gaXRlbXM/LltpXTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbUlkID0gZ2V0SXRlbUlkKHJhbmdlSXRlbSk7XG4gICAgICAgICAgICBpZiAocmFuZ2VJdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQocmFuZ2VJdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7XG4gICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcXVpcmVNb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgc2VsZWN0aW9uIGNoYW5nZSBldmVudFxuICAgICAqL1xuICAgIGNvbnN0IGVtaXRTZWxlY3Rpb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IGl0ZW1zLnJlZHVjZShcbiAgICAgICAgKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBhY2MucHVzaChpZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgICk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHsgc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzIH0pO1xuXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ub25TZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgICAgY29uZmlnLnNlbGVjdGlvbi5vblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZEl0ZW1zLCBzZWxlY3RlZEluZGljZXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXR1cDogbGlzdGVuIGZvciByZW5kZXJzIGFuZCBjbGlja3NcbiAgICBjb25zdCBzZXR1cCA9ICgpID0+IHtcbiAgICAgIC8vIEFkZCBtb2RlIGNsYXNzIHRvIGNvbnRhaW5lclxuICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGFkZENsYXNzKGNvbXBvbmVudC5lbGVtZW50LCBcInZsaXN0LS1zZWxlY3Rpb25cIik7XG4gICAgICAgIGFkZENsYXNzKGNvbXBvbmVudC5lbGVtZW50LCBgdmxpc3QtLXNlbGVjdGlvbi0ke3N0YXRlLm1vZGV9YCk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVJdGVtQ2xpY2ssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBzZWxlY3Rpb24gYWZ0ZXIgZWFjaCByZW5kZXJcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyxcbiAgICAgICk7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHNlbGVjdGlvbiB3aGVuIGl0ZW0gaXMgcmVtb3ZlZFxuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICAgIFwiaXRlbTpyZW1vdmVkXCIsXG4gICAgICAgIChkYXRhOiB7IGl0ZW06IGFueTsgaW5kZXg6IG51bWJlciB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGRhdGEuaXRlbSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZW1vdmVkIGl0ZW0gd2FzIHRoZSBsYXN0IHNlbGVjdGVkIGluZGV4LCBjbGVhciBpdFxuICAgICAgICAgICAgaWYgKHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID09PSBkYXRhLmluZGV4KSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA+IGRhdGEuaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZGp1c3QgbGFzdFNlbGVjdGVkSW5kZXggc2luY2UgaXRlbXMgc2hpZnRlZCBkb3duXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhZnRlciBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBzZXRUaW1lb3V0KHNldHVwLCAwKTtcblxuICAgIC8vIExpc3RlbiBmb3IgaW5pdGlhbCBsb2FkIGNvbXBsZXRlIHRvIGF1dG8tc2VsZWN0IGl0ZW1cbiAgICAvLyBUaGlzIG11c3QgYmUgaW4gd2l0aFNlbGVjdGlvbiBiZWNhdXNlIHNlbGVjdEJ5SWQgaXMgZGVmaW5lZCBoZXJlXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICBcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsXG4gICAgICAoZGF0YTogeyBzZWxlY3RJZDogc3RyaW5nIHwgbnVtYmVyIH0pID0+IHtcbiAgICAgICAgaWYgKGRhdGE/LnNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBVc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGVuc3VyZSByZW5kZXJpbmcgaXMgY29tcGxldGVcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChkYXRhLnNlbGVjdElkKTtcbiAgICAgICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcblxuICAgIC8vIEVuaGFuY2VkIGNvbXBvbmVudCB3aXRoIHNlbGVjdGlvbiBBUElcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICBzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICAvLyBJbiBzaW5nbGUgbW9kZSwgY2xlYXIgcHJldmlvdXMgc2VsZWN0aW9uIGJlZm9yZSBhZGRpbmcgbmV3IG9uZVxuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgaW5kaWNlcyA9IFtpbmRpY2VzWzBdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zW2luZGV4XSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW1zKGluZGljZXM6IG51bWJlcltdKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgICBpbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zW2luZGV4XSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBnZXRTZWxlY3RlZEl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIHJldHVybiBpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJbmRpY2VzKCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBudW1iZXJbXSwgaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSBhcyBudW1iZXJbXSk7XG4gICAgICB9LFxuXG4gICAgICBpc1NlbGVjdGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zPy5baW5kZXhdKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0QnlJZChpZDogc3RyaW5nIHwgbnVtYmVyLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpZCk7XG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGl0ZW0gYXQgaW5kZXgsIHNjcm9sbGluZyBhbmQgd2FpdGluZyBmb3IgZGF0YSBpZiBuZWVkZWRcbiAgICAgICAqIEhhbmRsZXMgdmlydHVhbCBzY3JvbGxpbmcgYnkgbG9hZGluZyBkYXRhIGJlZm9yZSBzZWxlY3RpbmdcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0QXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCBzY3JvbGwgdG8gdGhlIGluZGV4ICh0cmlnZ2VycyBkYXRhIGxvYWRpbmcgaWYgbmVlZGVkKVxuICAgICAgICBpZiAoZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0byBzZWxlY3QgaW1tZWRpYXRlbHkgLSB3b3JrcyBpZiBpdGVtIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICBpZiAoaXRlbXNbaW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEl0ZW0gbm90IGxvYWRlZCB5ZXQgLSB3YWl0IGZvciBkYXRhIHRvIGxvYWQgdGhlbiBzZWxlY3RcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgbGV0IHJlc29sdmVkID0gZmFsc2U7XG5cbiAgICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdGltZW91dCBpbiBjYXNlIGV2ZW50IGRvZXNuJ3QgZmlyZSAoZGF0YSBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBuZXh0IGl0ZW0gcmVsYXRpdmUgdG8gY3VycmVudCBzZWxlY3Rpb25cbiAgICAgICAqIEhhbmRsZXMgdmlydHVhbCBzY3JvbGxpbmcgYnkgbG9hZGluZyBkYXRhIGJlZm9yZSBzZWxlY3RpbmdcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TmV4dCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSB0aGlzLmdldFNlbGVjdGVkSW5kaWNlcygpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gU2VsZWN0IGZpcnN0IGl0ZW1cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuXG4gICAgICAgIGlmIChuZXh0SW5kZXggPCB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXRJbmRleChuZXh0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgcHJldmlvdXMgaXRlbSByZWxhdGl2ZSB0byBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgICogSGFuZGxlcyB2aXJ0dWFsIHNjcm9sbGluZyBieSBsb2FkaW5nIGRhdGEgYmVmb3JlIHNlbGVjdGluZ1xuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3RQcmV2aW91cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlc1swXTtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHByZXZJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoU2VsZWN0aW9uO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2Zvcm0udHNcblxuLyoqXG4gKiBGb3JtIENvbXBvbmVudCAtIEZ1bmN0aW9uYWwgZm9ybSBidWlsZGVyIHdpdGggbXRybCBjb21wb3NpdGlvblxuICpcbiAqIEEgZm9ybSBjb21wb25lbnQgdGhhdCB1c2VzIHRoZSBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtIHRvIGJ1aWxkXG4gKiBmb3JtcyBmcm9tIHNjaGVtYSBkZWZpbml0aW9ucywgd2l0aCBidWlsdC1pbiBkYXRhIG1hbmFnZW1lbnQsXG4gKiB2YWxpZGF0aW9uLCBhbmQgc3VibWlzc2lvbiBoYW5kbGluZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEZvcm1Db21wb25lbnQgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBJbXBvcnQgbXRybCBjb21wb3NlIHN5c3RlbVxuaW1wb3J0IHsgcGlwZSB9IGZyb20gJ210cmwnXG5pbXBvcnQgeyBjcmVhdGVCYXNlLCB3aXRoRWxlbWVudCB9IGZyb20gJ210cmwnXG5pbXBvcnQgeyB3aXRoRXZlbnRzLCB3aXRoTGlmZWN5Y2xlIH0gZnJvbSAnbXRybCdcblxuLy8gSW1wb3J0IGZvcm0gZmVhdHVyZXNcbmltcG9ydCB7XG4gIHdpdGhMYXlvdXQsXG4gIHdpdGhGaWVsZHMsXG4gIHdpdGhEYXRhLFxuICB3aXRoQ29udHJvbGxlcixcbiAgd2l0aFN1Ym1pdCxcbiAgd2l0aEFQSVxufSBmcm9tICcuL2ZlYXR1cmVzJ1xuXG4vLyBJbXBvcnQgY29uZmlndXJhdGlvblxuaW1wb3J0IHsgY3JlYXRlQmFzZUNvbmZpZywgZ2V0RWxlbWVudENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgRm9ybSBjb21wb25lbnQgdXNpbmcgZnVuY3Rpb25hbCBjb21wb3NpdGlvblxuICpcbiAqIEBwYXJhbSB7Rm9ybUNvbmZpZ30gY29uZmlnIC0gRm9ybSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtGb3JtQ29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgZm9ybSBjb21wb25lbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY3JlYXRlRm9ybSB9IGZyb20gJ210cmwtYWRkb25zJ1xuICogaW1wb3J0IHsgY3JlYXRlVGV4dGZpZWxkLCBjcmVhdGVTd2l0Y2gsIGNyZWF0ZUNoaXBzIH0gZnJvbSAnbXRybCdcbiAqXG4gKiBjb25zdCBmb3JtID0gY3JlYXRlRm9ybSh7XG4gKiAgIGNsYXNzOiAnYWNjb3VudC1mb3JtJyxcbiAqICAgYWN0aW9uOiAnL2FwaS91c2Vycy8nLFxuICogICBsYXlvdXQ6IFtcbiAqICAgICBbJ3NlY3Rpb24nLCB7IGNsYXNzOiAndXNlci1zZWN0aW9uJyB9LFxuICogICAgICAgWydkaXYnLCB7IGNsYXNzOiAnc2VjdGlvbi10aXRsZScsIHRleHQ6ICdVc2VyJyB9XSxcbiAqICAgICAgIFtjcmVhdGVUZXh0ZmllbGQsICdpbmZvLnVzZXJuYW1lJywgeyBsYWJlbDogJ1VzZXJuYW1lJyB9XSxcbiAqICAgICAgIFtjcmVhdGVDaGlwcywgJ2luZm8ucm9sZScsIHtcbiAqICAgICAgICAgbGFiZWw6ICdSb2xlJyxcbiAqICAgICAgICAgY2hpcHM6IFtcbiAqICAgICAgICAgICB7IHRleHQ6ICdyZWdpc3RlcmVkJywgdmFsdWU6ICdyZWdpc3RlcmVkJyB9LFxuICogICAgICAgICAgIHsgdGV4dDogJ2FkbWluJywgdmFsdWU6ICdhZG1pbicgfSxcbiAqICAgICAgICAgICB7IHRleHQ6ICdwcmVtaXVtJywgdmFsdWU6ICdwcmVtaXVtJyB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgIH1dLFxuICogICAgICAgW2NyZWF0ZVN3aXRjaCwgJ2luZm8uZW5hYmxlZCcsIHsgbGFiZWw6ICdFbmFibGVkJyB9XVxuICogICAgIF1cbiAqICAgXSxcbiAqICAgb246IHtcbiAqICAgICBjaGFuZ2U6IChkYXRhKSA9PiBjb25zb2xlLmxvZygnRm9ybSBjaGFuZ2VkOicsIGRhdGEpLFxuICogICAgIHN1Ym1pdDogKGRhdGEpID0+IGNvbnNvbGUubG9nKCdGb3JtIHN1Ym1pdHRlZDonLCBkYXRhKVxuICogICB9XG4gKiB9KVxuICpcbiAqIC8vIEFwcGVuZCB0byBET01cbiAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybS5lbGVtZW50KVxuICpcbiAqIC8vIFNldCBkYXRhXG4gKiBmb3JtLnNldERhdGEoe1xuICogICB1c2VybmFtZTogJ2pvaG5fZG9lJyxcbiAqICAgcm9sZTogJ2FkbWluJyxcbiAqICAgZW5hYmxlZDogdHJ1ZVxuICogfSlcbiAqXG4gKiAvLyBHZXQgZGF0YVxuICogY29uc3QgZGF0YSA9IGZvcm0uZ2V0RGF0YSgpXG4gKlxuICogLy8gQ2hlY2sgaWYgbW9kaWZpZWRcbiAqIGlmIChmb3JtLmlzTW9kaWZpZWQoKSkge1xuICogICBhd2FpdCBmb3JtLnN1Ym1pdCgpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZvcm0gPSAoY29uZmlnOiBGb3JtQ29uZmlnID0ge30pOiBGb3JtQ29tcG9uZW50ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBQcm9jZXNzIGNvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0c1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBjcmVhdGVCYXNlQ29uZmlnKGNvbmZpZylcblxuICAgIC8vIEJ1aWxkIHRoZSBmb3JtIHRocm91Z2ggZnVuY3Rpb25hbCBjb21wb3NpdGlvblxuICAgIC8vIEVhY2ggZnVuY3Rpb24gaW4gdGhlIHBpcGUgYWRkcyBzcGVjaWZpYyBjYXBhYmlsaXRpZXNcbiAgICBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllciAtIEJhc2UgY29tcG9uZW50IHdpdGggY29uZmlnXG4gICAgICBjcmVhdGVCYXNlLFxuXG4gICAgICAvLyAyLiBFdmVudCBzeXN0ZW0gLSBBZGRzIG9uL29mZi9lbWl0IG1ldGhvZHNcbiAgICAgIHdpdGhFdmVudHMoKSxcblxuICAgICAgLy8gMy4gRE9NIGVsZW1lbnQgLSBDcmVhdGVzIHRoZSByb290IGNvbnRhaW5lciBlbGVtZW50XG4gICAgICB3aXRoRWxlbWVudChnZXRFbGVtZW50Q29uZmlnKGJhc2VDb25maWcpKSxcblxuICAgICAgLy8gNC4gTGF5b3V0IC0gQ3JlYXRlcyBmb3JtIGVsZW1lbnQgYW5kIHByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hXG4gICAgICB3aXRoTGF5b3V0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA1LiBGaWVsZHMgLSBFeHRyYWN0cyBmaWVsZHMgZnJvbSBsYXlvdXQgYW5kIGNyZWF0ZXMgcmVnaXN0cnlcbiAgICAgIHdpdGhGaWVsZHMoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDYuIERhdGEgLSBBZGRzIGRhdGEgbWFuYWdlbWVudCAoZ2V0L3NldCwgY2hhbmdlIHRyYWNraW5nKVxuICAgICAgd2l0aERhdGEoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDcuIENvbnRyb2xsZXIgLSBBZGRzIG1vZGUgbWFuYWdlbWVudCAocmVhZC9jcmVhdGUvdXBkYXRlKVxuICAgICAgd2l0aENvbnRyb2xsZXIoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDguIFN1Ym1pdCAtIEFkZHMgdmFsaWRhdGlvbiBhbmQgc3VibWlzc2lvbiBoYW5kbGluZ1xuICAgICAgd2l0aFN1Ym1pdChiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOS4gTGlmZWN5Y2xlIC0gQWRkcyBsaWZlY3ljbGUgbWFuYWdlbWVudCAoZGVzdHJveSlcbiAgICAgIHdpdGhMaWZlY3ljbGUoKSxcblxuICAgICAgLy8gMTAuIEFQSSAtIENyZWF0ZXMgY2xlYW4gcHVibGljIEFQSVxuICAgICAgd2l0aEFQSShiYXNlQ29uZmlnKVxuICAgICkoYmFzZUNvbmZpZylcblxuICAgIC8vIEFwcGVuZCB0byBjb250YWluZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLmNvbnRhaW5lciAmJiBjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnQuZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIEZvcm1Db21wb25lbnRcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGb3JtIGNyZWF0aW9uIGVycm9yOicsIGVycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmb3JtOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUZvcm1cbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9sYXlvdXQudHNcblxuLyoqXG4gKiBMYXlvdXQgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIEJ1aWxkcyB0aGUgZm9ybSBzdHJ1Y3R1cmUgZnJvbSBhIGxheW91dCBzY2hlbWEgdXNpbmcgbXRybC1hZGRvbnMgbGF5b3V0IHN5c3RlbVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL2xheW91dFwiO1xuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBCYXNlRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBmb3JtIGVsZW1lbnRcbiAqL1xuY29uc3QgY3JlYXRlRm9ybUVsZW1lbnQgPSAoY29uZmlnOiBGb3JtQ29uZmlnKTogSFRNTEZvcm1FbGVtZW50ID0+IHtcbiAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO1xuXG4gIGlmIChjb25maWcubWV0aG9kKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJtZXRob2RcIiwgY29uZmlnLm1ldGhvZCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmFjdGlvbikge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYWN0aW9uXCIsIGNvbmZpZy5hY3Rpb24pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5hdXRvY29tcGxldGUpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiLCBjb25maWcuYXV0b2NvbXBsZXRlKTtcbiAgfVxuXG4gIC8vIFByZXZlbnQgZGVmYXVsdCBmb3JtIHN1Ym1pc3Npb24gLSB3ZSBoYW5kbGUgaXQgcHJvZ3JhbW1hdGljYWxseVxuICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHJldHVybiBmb3JtO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgbGF5b3V0IHNjaGVtYSBhbmQgZXh0cmFjdHMgbmFtZWQgY29tcG9uZW50c1xuICovXG5jb25zdCBwcm9jZXNzTGF5b3V0U2NoZW1hID0gKFxuICBzY2hlbWE6IHVua25vd25bXSxcbiAgZm9ybTogSFRNTEZvcm1FbGVtZW50LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB7IHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgbGF5b3V0UmVzdWx0OiB1bmtub3duIH0gPT4ge1xuICBpZiAoIXNjaGVtYSB8fCAhQXJyYXkuaXNBcnJheShzY2hlbWEpIHx8IHNjaGVtYS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuICB9XG5cbiAgLy8gVXNlIG10cmwtYWRkb25zIGNyZWF0ZUxheW91dCB0byBwcm9jZXNzIHRoZSBzY2hlbWFcbiAgY29uc3QgbGF5b3V0UmVzdWx0ID0gY3JlYXRlTGF5b3V0KHNjaGVtYSwgZm9ybSwge30pO1xuXG4gIC8vIEV4dHJhY3QgbmFtZWQgY29tcG9uZW50cyBmcm9tIGxheW91dCByZXN1bHRcbiAgY29uc3QgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgaWYgKGxheW91dFJlc3VsdCAmJiB0eXBlb2YgbGF5b3V0UmVzdWx0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgLy8gVGhlIGxheW91dCByZXN1bHQgY29udGFpbnMgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAgICBjb25zdCByZXN1bHQgPSBsYXlvdXRSZXN1bHQgYXMgeyBjb21wb25lbnQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgIGlmIChyZXN1bHQuY29tcG9uZW50KSB7XG4gICAgICBPYmplY3QuYXNzaWduKHVpLCByZXN1bHQuY29tcG9uZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyB1aSwgbGF5b3V0UmVzdWx0IH07XG59O1xuXG4vKipcbiAqIHdpdGhMYXlvdXQgZmVhdHVyZVxuICogQWRkcyBmb3JtIGVsZW1lbnQgY3JlYXRpb24gYW5kIGxheW91dCBwcm9jZXNzaW5nXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTGF5b3V0ID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZvcm06IEhUTUxGb3JtRWxlbWVudDtcbiAgICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgbGF5b3V0UmVzdWx0OiB1bmtub3duO1xuICB9ID0+IHtcbiAgICAvLyBDcmVhdGUgdGhlIGZvcm0gZWxlbWVudFxuICAgIGNvbnN0IGZvcm0gPSBjcmVhdGVGb3JtRWxlbWVudChjb25maWcpO1xuXG4gICAgLy8gQXBwZW5kIGZvcm0gdG8gY29tcG9uZW50J3Mgcm9vdCBlbGVtZW50XG4gICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb21wb25lbnQuZWxlbWVudC5hcHBlbmRDaGlsZChmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGxheW91dCBzY2hlbWEgaWYgcHJvdmlkZWRcbiAgICBjb25zdCB7IHVpLCBsYXlvdXRSZXN1bHQgfSA9IGNvbmZpZy5sYXlvdXRcbiAgICAgID8gcHJvY2Vzc0xheW91dFNjaGVtYShjb25maWcubGF5b3V0LCBmb3JtLCBjb25maWcpXG4gICAgICA6IHsgdWk6IHt9LCBsYXlvdXRSZXN1bHQ6IG51bGwgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBmb3JtLFxuICAgICAgdWksXG4gICAgICBsYXlvdXRSZXN1bHQsXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhMYXlvdXQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRzLnRzXG5cbi8qKlxuICogRGF0YSBzdGF0ZSBjb25zdGFudHNcbiAqIFRyYWNrcyB3aGV0aGVyIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IERBVEFfU1RBVEUgPSB7XG4gIC8qKiBEYXRhIG1hdGNoZXMgaW5pdGlhbCBzdGF0ZSAtIG5vIGNoYW5nZXMgbWFkZSAqL1xuICBQUklTVElORTogXCJwcmlzdGluZVwiLFxuICAvKiogRGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGUgKi9cbiAgRElSVFk6IFwiZGlydHlcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBldmVudCBjb25zdGFudHNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBhbnkgZmllbGQgdmFsdWUgY2hhbmdlcyAqL1xuICBDSEFOR0U6IFwiY2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIGZvcm0gaXMgc3VibWl0dGVkICovXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBzdGF0ZSBjaGFuZ2VzIChwcmlzdGluZSA8LT4gZGlydHkpICovXG4gIFNUQVRFX0NIQU5HRTogXCJzdGF0ZTpjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyBzZXQgb24gdGhlIGZvcm0gKi9cbiAgREFUQV9TRVQ6IFwiZGF0YTpzZXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgZm9ybSAqL1xuICBEQVRBX0dFVDogXCJkYXRhOmdldFwiLFxuICAvKiogRmlyZWQgd2hlbiBhIHNwZWNpZmljIGZpZWxkIGNoYW5nZXMgKi9cbiAgRklFTERfQ0hBTkdFOiBcImZpZWxkOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiB2YWxpZGF0aW9uIGZhaWxzICovXG4gIFZBTElEQVRJT05fRVJST1I6IFwidmFsaWRhdGlvbjplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgc3VjY2VlZHMgKi9cbiAgU1VCTUlUX1NVQ0NFU1M6IFwic3VibWl0OnN1Y2Nlc3NcIixcbiAgLyoqIEZpcmVkIHdoZW4gc3VibWl0IGZhaWxzICovXG4gIFNVQk1JVF9FUlJPUjogXCJzdWJtaXQ6ZXJyb3JcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyByZXNldCB0byBpbml0aWFsIHN0YXRlICovXG4gIFJFU0VUOiBcInJlc2V0XCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEZvcm0gQ1NTIGNsYXNzIG1vZGlmaWVyc1xuICovXG5leHBvcnQgY29uc3QgRk9STV9DTEFTU0VTID0ge1xuICAvKiogQXBwbGllZCB3aGVuIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgKi9cbiAgTU9ESUZJRUQ6IFwibW9kaWZpZWRcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGlzIHN1Ym1pdHRpbmcgKi9cbiAgU1VCTUlUVElORzogXCJzdWJtaXR0aW5nXCIsXG4gIC8qKiBBcHBsaWVkIHdoZW4gZm9ybSBpcyBkaXNhYmxlZCAqL1xuICBESVNBQkxFRDogXCJkaXNhYmxlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBEZWZhdWx0IGZvcm0gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY29uc3QgRk9STV9ERUZBVUxUUyA9IHtcbiAgcHJlZml4OiBcIm10cmxcIixcbiAgY29tcG9uZW50TmFtZTogXCJmb3JtXCIsXG4gIHRhZzogXCJkaXZcIixcbiAgZm9ybVRhZzogXCJmb3JtXCIsXG4gIG1ldGhvZDogXCJQT1NUXCIsXG4gIGF1dG9jb21wbGV0ZTogXCJvZmZcIixcbiAgdXNlQ2hhbmdlczogdHJ1ZSxcbiAgY29udHJvbHM6IFtcInN1Ym1pdFwiLCBcImNhbmNlbFwiXSxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRmllbGQgbmFtZSBwcmVmaXhlcyB1c2VkIGZvciBleHRyYWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGSUVMRF9QUkVGSVhFUyA9IHtcbiAgSU5GTzogXCJpbmZvLlwiLFxuICBGSUxFOiBcImZpbGUuXCIsXG4gIERBVEE6IFwiZGF0YS5cIixcbn0gYXMgY29uc3Q7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vY29uZmlnLnRzXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybVN0YXRlLCBGb3JtRGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8vIFJlLWV4cG9ydCBGT1JNX0RFRkFVTFRTIGZvciB1c2UgaW4gb3RoZXIgbW9kdWxlc1xuZXhwb3J0IHsgRk9STV9ERUZBVUxUUyB9O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGJhc2UgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHRzIGFwcGxpZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUJhc2VDb25maWcgPSAoY29uZmlnOiBGb3JtQ29uZmlnID0ge30pOiBGb3JtQ29uZmlnID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5GT1JNX0RFRkFVTFRTLFxuICAgIC4uLmNvbmZpZyxcbiAgICBwcmVmaXg6IGNvbmZpZy5wcmVmaXggfHwgRk9STV9ERUZBVUxUUy5wcmVmaXgsXG4gICAgY29tcG9uZW50TmFtZTogY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgRk9STV9ERUZBVUxUUy5jb21wb25lbnROYW1lLFxuICAgIGNvbnRyb2xzOlxuICAgICAgY29uZmlnLmNvbnRyb2xzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBjb25maWcuY29udHJvbHNcbiAgICAgICAgOiBbLi4uRk9STV9ERUZBVUxUUy5jb250cm9sc10sXG4gICAgc3lzaW5mbzogY29uZmlnLnN5c2luZm8gfHwgW10sXG4gICAgdmFsaWRhdGlvbjogY29uZmlnLnZhbGlkYXRpb24gfHwgW10sXG4gICAgb246IGNvbmZpZy5vbiB8fCB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBmb3JtIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVJbml0aWFsU3RhdGUgPSAoY29uZmlnOiBGb3JtQ29uZmlnKTogRm9ybVN0YXRlID0+IHtcbiAgY29uc3QgaW5pdGlhbERhdGEgPSBjb25maWcuZGF0YSA/IHsgLi4uY29uZmlnLmRhdGEgfSA6IHt9O1xuXG4gIHJldHVybiB7XG4gICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgIHN1Ym1pdHRpbmc6IGZhbHNlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBpbml0aWFsRGF0YSxcbiAgICBjdXJyZW50RGF0YTogeyAuLi5pbml0aWFsRGF0YSB9LFxuICAgIGVycm9yczoge30sXG4gIH07XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGVsZW1lbnQgY29uZmlndXJhdGlvbiBmb3Igd2l0aEVsZW1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRDb25maWcgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgRk9STV9ERUZBVUxUUy5wcmVmaXg7XG4gIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWU7XG5cbiAgY29uc3QgY2xhc3NOYW1lcyA9IFtgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX1gXTtcblxuICBpZiAoY29uZmlnLmNsYXNzKSB7XG4gICAgY2xhc3NOYW1lcy5wdXNoKGNvbmZpZy5jbGFzcyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRhZzogXCJkaXZcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbihcIiBcIiksXG4gICAgYXR0cmlidXRlczoge1xuICAgICAgXCJkYXRhLWNvbXBvbmVudFwiOiBjb21wb25lbnROYW1lLFxuICAgIH0sXG4gIH07XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGZpZWxkIG5hbWUgZnJvbSBhIHByZWZpeGVkIG5hbWUgKGUuZy4sICdpbmZvLnVzZXJuYW1lJyAtPiAndXNlcm5hbWUnKVxuICovXG5leHBvcnQgY29uc3QgZXh0cmFjdEZpZWxkTmFtZSA9IChwcmVmaXhlZE5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHBhcnRzID0gcHJlZml4ZWROYW1lLnNwbGl0KFwiLlwiKTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5zbGljZSgxKS5qb2luKFwiLlwiKSA6IHByZWZpeGVkTmFtZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZnVsbCBmaWVsZCBwYXRoIGluY2x1ZGluZyBwcmVmaXhcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkUGF0aCA9IChuYW1lOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nID0gXCJpbmZvXCIpOiBzdHJpbmcgPT4ge1xuICBpZiAobmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuICByZXR1cm4gYCR7cHJlZml4fS4ke25hbWV9YDtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbmFtZSBpcyBhIGZpZWxkIG5hbWUgKHN0YXJ0cyB3aXRoIGluZm8uIG9yIGRhdGEuKVxuICovXG5leHBvcnQgY29uc3QgaXNGaWVsZE5hbWUgPSAobmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoXCJpbmZvLlwiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoXCJkYXRhLlwiKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbmFtZSBpcyBhIGZpbGUgZmllbGQgbmFtZVxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImZpbGUuXCIpO1xufTtcblxuLyoqXG4gKiBEZWVwIGNvbXBhcmlzb24gb2YgdHdvIHZhbHVlcyBmb3IgY2hhbmdlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3QgaXNWYWx1ZUVxdWFsID0gKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBhID09IGI7XG5cbiAgLy8gSGFuZGxlIGFycmF5c1xuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBhLmV2ZXJ5KCh2YWwsIGlkeCkgPT4gaXNWYWx1ZUVxdWFsKHZhbCwgYltpZHhdKSk7XG4gIH1cblxuICAvLyBIYW5kbGUgb2JqZWN0c1xuICBpZiAodHlwZW9mIGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGIgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgb2JqZWN0KTtcbiAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGIgYXMgb2JqZWN0KTtcbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4ga2V5c0EuZXZlcnkoKGtleSkgPT5cbiAgICAgIGlzVmFsdWVFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgKHdpdGggdHlwZSBjb2VyY2lvbiBmb3Igc3RyaW5nL251bWJlciBjb21wYXJpc29uKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gIHJldHVybiBhID09IGI7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBmb3JtIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgZnJvbSBpbml0aWFsIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNEYXRhQ2hhbmdlZCA9IChcbiAgaW5pdGlhbDogRm9ybURhdGEsXG4gIGN1cnJlbnQ6IEZvcm1EYXRhLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGFsbEtleXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhpbml0aWFsKSwgLi4uT2JqZWN0LmtleXMoY3VycmVudCldKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhbGxLZXlzKSB7XG4gICAgaWYgKCFpc1ZhbHVlRXF1YWwoaW5pdGlhbFtrZXldLCBjdXJyZW50W2tleV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEdldHMgb25seSB0aGUgbW9kaWZpZWQgZmllbGRzIGJldHdlZW4gaW5pdGlhbCBhbmQgY3VycmVudCBkYXRhXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNb2RpZmllZEZpZWxkcyA9IChcbiAgaW5pdGlhbDogRm9ybURhdGEsXG4gIGN1cnJlbnQ6IEZvcm1EYXRhLFxuKTogRm9ybURhdGEgPT4ge1xuICBjb25zdCBtb2RpZmllZDogRm9ybURhdGEgPSB7fTtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIG1vZGlmaWVkW2tleV0gPSBjdXJyZW50W2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1vZGlmaWVkO1xufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9maWVsZHMudHNcblxuLyoqXG4gKiBGaWVsZHMgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgbWFuYWdlcyB0aGUgZmllbGQgcmVnaXN0cnlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtRmllbGQsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGaWVsZFZhbHVlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzRmllbGROYW1lLCBpc0ZpbGVOYW1lLCBleHRyYWN0RmllbGROYW1lIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBvYmplY3QgaXMgYSB2YWxpZCBmb3JtIGZpZWxkIGNvbXBvbmVudFxuICogQSBmb3JtIGZpZWxkIG11c3QgaGF2ZSBhdCBsZWFzdCBnZXRWYWx1ZSBvciBzZXRWYWx1ZSBtZXRob2RcbiAqL1xuY29uc3QgaXNGb3JtRmllbGQgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIEZvcm1GaWVsZCA9PiB7XG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjYW5kaWRhdGUgPSBvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gTXVzdCBoYXZlIGVsZW1lbnQgcHJvcGVydHlcbiAgaWYgKCFjYW5kaWRhdGUuZWxlbWVudCB8fCAhKGNhbmRpZGF0ZS5lbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTXVzdCBoYXZlIGdldFZhbHVlIG9yIHNldFZhbHVlXG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGNhbmRpZGF0ZS5nZXRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIGNhbmRpZGF0ZS5zZXRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGZyb20gYSBmaWVsZCBjb21wb25lbnRcbiAqIEFsbCBtdHJsIGNvbXBvbmVudHMgbm93IGhhdmUgdW5pZmllZCBnZXRWYWx1ZSgpIEFQSTpcbiAqIC0gVGV4dGZpZWxkOiByZXR1cm5zIHN0cmluZ1xuICogLSBTZWxlY3Q6IHJldHVybnMgc3RyaW5nIG9yIHN0cmluZ1tdXG4gKiAtIENoaXBzOiByZXR1cm5zIHN0cmluZ1tdXG4gKiAtIFN3aXRjaC9DaGVja2JveDogcmV0dXJucyBib29sZWFuICh1cGRhdGVkIGluIG10cmwgY29yZSlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkVmFsdWUgPSAoZmllbGQ6IEZvcm1GaWVsZCk6IEZpZWxkVmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIGZpZWxkLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmllbGQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBjaGVjayBmb3IgdmFsdWUgcHJvcGVydHlcbiAgY29uc3QgZmllbGRBbnkgPSBmaWVsZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoXCJ2YWx1ZVwiIGluIGZpZWxkQW55KSB7XG4gICAgcmV0dXJuIGZpZWxkQW55LnZhbHVlIGFzIEZpZWxkVmFsdWU7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvbiBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIHNldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IGFjY2VwdHMgc3RyaW5nXG4gKiAtIFNlbGVjdDogYWNjZXB0cyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IGFjY2VwdHMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiBhY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIChcInRydWVcIi9cImZhbHNlXCIpICh1cGRhdGVkIGluIG10cmwgY29yZSlcbiAqXG4gKiBGb3Igc2lsZW50IHVwZGF0ZXMgKG5vIGNoYW5nZSBldmVudHMpLCB3ZSBzZXQgZGlyZWN0bHkgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEZpZWxkVmFsdWUgPSAoXG4gIGZpZWxkOiBGb3JtRmllbGQsXG4gIHZhbHVlOiBGaWVsZFZhbHVlLFxuICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaWYgKHNpbGVudCkge1xuICAgIC8vIFNpbGVudCB1cGRhdGU6IHNldCBkaXJlY3RseSBvbiBpbnB1dCB0byBhdm9pZCB0cmlnZ2VyaW5nIGNoYW5nZSBldmVudHNcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIGlmIChpbnB1dC50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkQmVDaGVja2VkID1cbiAgICAgICAgICB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IDE7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSBzaG91bGRCZUNoZWNrZWQ7XG4gICAgICAgIC8vIFVwZGF0ZSB2aXN1YWwgc3RhdGUgYnkgdG9nZ2xpbmcgdGhlIGNoZWNrZWQgY2xhc3NcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShgJHtiYXNlQ2xhc3N9LS1jaGVja2VkYCwgc2hvdWxkQmVDaGVja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRleHQgaW5wdXQgLSBzZXQgdmFsdWUgZGlyZWN0bHlcbiAgICAgICAgaW5wdXQudmFsdWUgPSAodmFsdWUgYXMgc3RyaW5nKSA/PyBcIlwiO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIC0gdG9nZ2xlIC0tZW1wdHkgY2xhc3MgYmFzZWQgb24gdmFsdWVcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSAhaW5wdXQudmFsdWU7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tZW1wdHlgLCBpc0VtcHR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aG91dCBpbnB1dCAobGlrZSBjaGlwcywgc2VsZWN0KSwgZmFsbCB0aHJvdWdoIHRvIHNldFZhbHVlXG4gICAgLy8gYnV0IHN0aWxsIHVzZSBzaWxlbnQgbW9kZSBiZWhhdmlvciAobm8gZXZlbnRzIHRyaWdnZXJlZClcbiAgfVxuXG4gIC8vIE5vcm1hbCB1cGRhdGU6IHVzZSBjb21wb25lbnQncyBzZXRWYWx1ZSBtZXRob2RcbiAgaWYgKHR5cGVvZiBmaWVsZC5zZXRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZmllbGQuc2V0VmFsdWUodmFsdWUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBzZXQgdmFsdWUgcHJvcGVydHkgZGlyZWN0bHlcbiAgaWYgKFwidmFsdWVcIiBpbiBmaWVsZEFueSkge1xuICAgIGZpZWxkQW55LnZhbHVlID0gdmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gdGhlIFVJIGNvbXBvbmVudCByZWdpc3RyeVxuICogTG9va3MgZm9yIGNvbXBvbmVudHMgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoICdpbmZvLicgb3IgJ2RhdGEuJ1xuICovXG5jb25zdCBleHRyYWN0RmllbGRzID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTsgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5IH0gPT4ge1xuICBjb25zdCBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICBjb25zdCBmaWxlczogRm9ybUZpZWxkUmVnaXN0cnkgPSBuZXcgTWFwKCk7XG5cbiAgaWYgKCF1aSkgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXModWkpKSB7XG4gICAgLy8gU2tpcCBub24tZmllbGQgY29tcG9uZW50c1xuICAgIGlmICghaXNGb3JtRmllbGQoY29tcG9uZW50KSkgY29udGludWU7XG5cbiAgICBpZiAoaXNGaWVsZE5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmllbGQgbmFtZSB3aXRob3V0IHByZWZpeCAoaW5mby51c2VybmFtZSAtPiB1c2VybmFtZSlcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWVsZHMuc2V0KGZpZWxkTmFtZSwgY29tcG9uZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzRmlsZU5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmlsZSBuYW1lIHdpdGhvdXQgcHJlZml4IChmaWxlLmF2YXRhciAtPiBhdmF0YXIpXG4gICAgICBjb25zdCBmaWxlTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWxlcy5zZXQoZmlsZU5hbWUsIGNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gZmllbGQgdmFsdWVzIGZvciBlcXVhbGl0eVxuICogSGFuZGxlcyBhcnJheXMgKGZvciBjaGlwcy9tdWx0aS1zZWxlY3QpIGFuZCBwcmltaXRpdmUgdmFsdWVzXG4gKi9cbmNvbnN0IHZhbHVlc0VxdWFsID0gKGE6IEZpZWxkVmFsdWUsIGI6IEZpZWxkVmFsdWUpOiBib29sZWFuID0+IHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgYXJyYXlzIChjaGlwcywgbXVsdGktc2VsZWN0KVxuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBhLmV2ZXJ5KCh2YWwsIGkpID0+IHZhbCA9PT0gYltpXSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEJpbmRzIGNoYW5nZSBhbmQgaW5wdXQgZXZlbnRzIHRvIGZpZWxkc1xuICogQ2FsbHMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIHdoZW4gYW55IGZpZWxkIGNoYW5nZXNcbiAqXG4gKiBMaXN0ZW5zIHRvIGJvdGggJ2lucHV0JyAoZm9yIGltbWVkaWF0ZSBmZWVkYmFjayB3aGlsZSB0eXBpbmcpXG4gKiBhbmQgJ2NoYW5nZScgKGZvciBjb21wb25lbnRzIHRoYXQgb25seSBlbWl0IG9uIGJsdXIvc2VsZWN0aW9uKVxuICpcbiAqIERlZHVwbGljYXRlcyBldmVudHMgdG8gcHJldmVudCBkb3VibGUtZmlyaW5nIHdoZW4gYm90aCBpbnB1dCBhbmQgY2hhbmdlXG4gKiBlbWl0IGZvciB0aGUgc2FtZSB2YWx1ZSAoZS5nLiwgdGV4dGZpZWxkIGlucHV0IGZvbGxvd2VkIGJ5IGJsdXIpXG4gKi9cbi8qKlxuICogVHJhY2tzIGxhc3QgZW1pdHRlZCB2YWx1ZXMgcGVyIGZpZWxkIGZvciBkZWR1cGxpY2F0aW9uXG4gKiBFeHBvc2VkIHNvIHRoYXQgc2V0RGF0YSBjYW4gdXBkYXRlIGl0IHdoZW4gc2V0dGluZyB2YWx1ZXMgc2lsZW50bHlcbiAqL1xubGV0IGZpZWxkVmFsdWVUcmFja2VyOiBNYXA8c3RyaW5nLCBGaWVsZFZhbHVlPiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRyYWNrZWQgdmFsdWUgZm9yIGEgZmllbGRcbiAqIENhbGxlZCB3aGVuIHNldERhdGEgaXMgdXNlZCB3aXRoIHNpbGVudD10cnVlIHRvIGtlZXAgZGVkdXBsaWNhdGlvbiBpbiBzeW5jXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVUcmFja2VkRmllbGRWYWx1ZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZTogRmllbGRWYWx1ZSxcbik6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgdmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYWxsIHRyYWNrZWQgZmllbGQgdmFsdWVzIGZyb20gYSBmaWVsZHMgcmVnaXN0cnlcbiAqIENhbGxlZCBhZnRlciBzaWxlbnQgc2V0RGF0YSB0byBzeW5jIGRlZHVwbGljYXRpb24gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNUcmFja2VkRmllbGRWYWx1ZXMgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgZ2V0RmllbGRWYWx1ZShmaWVsZCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgYmluZEZpZWxkRXZlbnRzID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBvbkZpZWxkQ2hhbmdlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSkgPT4gdm9pZCxcbik6IHZvaWQgPT4ge1xuICAvLyBUcmFjayBsYXN0IGVtaXR0ZWQgdmFsdWUgcGVyIGZpZWxkIHRvIGRlZHVwZSBldmVudHNcbiAgY29uc3QgbGFzdEVtaXR0ZWRWYWx1ZXMgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcblxuICAvLyBFeHBvc2UgdGhlIHRyYWNrZXIgc28gc2V0RGF0YSBjYW4gdXBkYXRlIGl0XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbGFzdEVtaXR0ZWRWYWx1ZXM7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gQmluZCBjaGFuZ2UgZXZlbnRzIGlmIGNvbXBvbmVudCBoYXMgZW1pdFxuICAgIGlmIChjb21wb25lbnQuZW1pdCkge1xuICAgICAgYmluZEZpZWxkRXZlbnRzKGZpZWxkcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWVsZDpjaGFuZ2VcIiwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGZpbGVzLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIGZpZWxkIGNvbXBvbmVudCBieSBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkKG5hbWU6IHN0cmluZyk6IEZvcm1GaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBmaWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmaWVsZHMua2V5cygpKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBmaWVsZCBleGlzdHNcbiAgICAgICAqL1xuICAgICAgaGFzRmllbGQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZHMuaGFzKG5hbWUpO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aEZpZWxkcztcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9kYXRhLnRzXG5cbi8qKlxuICogRGF0YSBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBmb3JtIGRhdGEgb3BlcmF0aW9uczogZ2V0L3NldCBkYXRhLCBjaGFuZ2UgdHJhY2tpbmcsIHNuYXBzaG90c1xuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZpZWxkVmFsdWUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUluaXRpYWxTdGF0ZSxcbiAgaGFzRGF0YUNoYW5nZWQsXG4gIGdldE1vZGlmaWVkRmllbGRzLFxufSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBnZXRGaWVsZFZhbHVlLCBzZXRGaWVsZFZhbHVlLCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzIH0gZnJvbSBcIi4vZmllbGRzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUywgREFUQV9TVEFURSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb2xsZWN0cyBjdXJyZW50IHZhbHVlcyBmcm9tIGFsbCBmaWVsZHNcbiAqL1xuY29uc3QgY29sbGVjdEZpZWxkRGF0YSA9IChmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5KTogRm9ybURhdGEgPT4ge1xuICBjb25zdCBkYXRhOiBGb3JtRGF0YSA9IHt9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGZpZWxkXSBvZiBmaWVsZHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vKipcbiAqIFNldHMgdmFsdWVzIG9uIGZpZWxkcyBmcm9tIGEgZGF0YSBvYmplY3RcbiAqIFN1cHBvcnRzIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIHZhbHVlcyAoZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0pXG4gKi9cbmNvbnN0IHNldEZpZWxkc0RhdGEgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgaWYgKG5hbWUgaW4gZGF0YSkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YVtuYW1lXSwgc2lsZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBuZXN0ZWQgdmFsdWUgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAgLy8gZS5nLiwgZmllbGQgbmFtZSAndXNlcm5hbWUnIG1pZ2h0IGJlIGluIGRhdGEgYXMgbmVzdGVkIHsgaW5mbzogeyB1c2VybmFtZTogJ3ZhbHVlJyB9IH1cbiAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKGRhdGEsIG5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSBhcyBGaWVsZFZhbHVlLCBzaWxlbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBnZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuKTogdW5rbm93biA9PiB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBuZXN0ZWQgdmFsdWUgaW4gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAoIShwYXJ0IGluIGN1cnJlbnQpIHx8IHR5cGVvZiBjdXJyZW50W3BhcnRdICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBjdXJyZW50W3BhcnRdID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgZmxhdCBmaWVsZCBkYXRhIHRvIG5lc3RlZCBvYmplY3Qgc3RydWN0dXJlXG4gKiBlLmcuLCB7ICd1c2VyLm5hbWUnOiAnSm9obicgfSAtPiB7IHVzZXI6IHsgbmFtZTogJ0pvaG4nIH0gfVxuICovXG5jb25zdCBmbGF0VG9OZXN0ZWQgPSAoZGF0YTogRm9ybURhdGEpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgIGlmIChrZXkuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICBzZXROZXN0ZWRWYWx1ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6ICgpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gSWYgaW5pdGlhbCBkYXRhIHdhcyBwcm92aWRlZCwgc2V0IGl0IG9uIGZpZWxkc1xuICAgIGlmIChjb25maWcuZGF0YSAmJiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGNvbmZpZy5kYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgIH1cblxuICAgIC8vIExpc3RlbiBmb3IgZmllbGQgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBpZiAoY29tcG9uZW50Lm9uKSB7XG4gICAgICBjb21wb25lbnQub24oXG4gICAgICAgIFwiZmllbGQ6Y2hhbmdlXCIsXG4gICAgICAgIChldmVudDogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBGaWVsZFZhbHVlIH0pID0+IHtcbiAgICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IHdhc01vZGlmaWVkID0gc3RhdGUubW9kaWZpZWQ7XG4gICAgICAgICAgc3RhdGUubW9kaWZpZWQgPSBoYXNEYXRhQ2hhbmdlZChzdGF0ZS5pbml0aWFsRGF0YSwgc3RhdGUuY3VycmVudERhdGEpO1xuXG4gICAgICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2UgZXZlbnQgd2hlbiBtb2RpZmllZCBzdGF0ZSBjaGFuZ2VzXG4gICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIGNvbnRyb2xsZXIgdG8gZW5hYmxlL2Rpc2FibGUgY29udHJvbHMgYWNjb3JkaW5nbHlcbiAgICAgICAgICBpZiAod2FzTW9kaWZpZWQgIT09IHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSwge1xuICAgICAgICAgICAgICBtb2RpZmllZDogc3RhdGUubW9kaWZpZWQsXG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZS5tb2RpZmllZCA/IERBVEFfU1RBVEUuRElSVFkgOiBEQVRBX1NUQVRFLlBSSVNUSU5FLFxuICAgICAgICAgICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgc3RhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGFsbCBmb3JtIGRhdGFcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIC8vIEFsd2F5cyBjb2xsZWN0IGZyZXNoIGRhdGEgZnJvbSBmaWVsZHNcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gZGF0YTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5EQVRBX0dFVCwgZGF0YSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZm9ybSBkYXRhXG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgb2JqZWN0IHRvIHNldFxuICAgICAgICogQHBhcmFtIHNpbGVudCAtIElmIHRydWUsIGRvbid0IGVtaXQgY2hhbmdlIGV2ZW50cyBhbmQgdXBkYXRlIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBkYXRhLCBzaWxlbnQpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG5cbiAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgIC8vIFdoZW4gc2V0dGluZyBkYXRhIHNpbGVudGx5LCBhbHNvIHVwZGF0ZSBpbml0aWFsIGRhdGEgc25hcHNob3RcbiAgICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gbG9hZGluZyBkYXRhIGZyb20gc2VydmVyXG4gICAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLnN0YXRlLmN1cnJlbnREYXRhIH07XG4gICAgICAgICAgc3RhdGUubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgICAvLyBTeW5jIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBldmVudCBkZWR1cGxpY2F0aW9uXG4gICAgICAgICAgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyhjb21wb25lbnQuZmllbGRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkRBVEFfU0VULCBzdGF0ZS5jdXJyZW50RGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZFZhbHVlKG5hbWU6IHN0cmluZyk6IEZpZWxkVmFsdWUge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbXBvbmVudC5maWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlLmN1cnJlbnREYXRhW25hbWVdO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKi9cbiAgICAgIHNldEZpZWxkVmFsdWUoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gICAgICAgIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCBzaWxlbnQpO1xuICAgICAgICAgIHN0YXRlLmN1cnJlbnREYXRhW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgc3RhdGUubW9kaWZpZWQgPSBoYXNEYXRhQ2hhbmdlZChzdGF0ZS5pbml0aWFsRGF0YSwgc3RhdGUuY3VycmVudERhdGEpO1xuXG4gICAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuRklFTERfQ0hBTkdFLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGZvcm0gaGFzIGJlZW4gbW9kaWZpZWQgZnJvbSBpbml0aWFsIHN0YXRlXG4gICAgICAgKi9cbiAgICAgIGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgICAgc3RhdGUubW9kaWZpZWQgPSBoYXNEYXRhQ2hhbmdlZChzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZWQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBvbmx5IHRoZSBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWRcbiAgICAgICAqL1xuICAgICAgZ2V0TW9kaWZpZWREYXRhKCk6IEZvcm1EYXRhIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZWRGaWVsZHMoc3RhdGUuaW5pdGlhbERhdGEsIGN1cnJlbnREYXRhKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVGFrZSBhIHNuYXBzaG90IG9mIGN1cnJlbnQgZGF0YSBhcyB0aGUgbmV3IGJhc2VsaW5lXG4gICAgICAgKiBGdXR1cmUgaXNNb2RpZmllZCgpIGNhbGxzIHdpbGwgY29tcGFyZSBhZ2FpbnN0IHRoaXMgc25hcHNob3RcbiAgICAgICAqL1xuICAgICAgc25hcHNob3QoKTogdm9pZCB7XG4gICAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5jb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpIH07XG4gICAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0geyAuLi5zdGF0ZS5pbml0aWFsRGF0YSB9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNldCBmb3JtIHRvIGluaXRpYWwgZGF0YSBzdGF0ZVxuICAgICAgICovXG4gICAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBzdGF0ZS5pbml0aWFsRGF0YSwgdHJ1ZSk7XG4gICAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0geyAuLi5zdGF0ZS5pbml0aWFsRGF0YSB9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5lcnJvcnMgPSB7fTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW1wdHlEYXRhOiBGb3JtRGF0YSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29tcG9uZW50LmZpZWxkcy5rZXlzKCkpIHtcbiAgICAgICAgICBlbXB0eURhdGFbbmFtZV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgZW1wdHlEYXRhLCB0cnVlKTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7fTtcbiAgICAgICAgc3RhdGUubW9kaWZpZWQgPSBoYXNEYXRhQ2hhbmdlZChzdGF0ZS5pbml0aWFsRGF0YSwgc3RhdGUuY3VycmVudERhdGEpO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlJFU0VUKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCB7IGZsYXRUb05lc3RlZCwgZ2V0TmVzdGVkVmFsdWUsIHNldE5lc3RlZFZhbHVlIH07XG5leHBvcnQgZGVmYXVsdCB3aXRoRGF0YTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzXG5cbi8qKlxuICogQ29udHJvbGxlciBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogTWFuYWdlcyBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdC9jYW5jZWwpIGJhc2VkIG9uIGRhdGEgc3RhdGUgKHByaXN0aW5lL2RpcnR5KVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1GaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEQVRBX1NUQVRFLCBGT1JNX0VWRU5UUywgRk9STV9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRk9STV9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBmb3JtJ3Mgc3RhdGUgQ1NTIGNsYXNzXG4gKi9cbmNvbnN0IHVwZGF0ZVN0YXRlQ2xhc3MgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBtb2RpZmllZDogYm9vbGVhbixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBtb2RpZmllZENsYXNzID0gYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5NT0RJRklFRH1gO1xuICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUobW9kaWZpZWRDbGFzcywgbW9kaWZpZWQpO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGFsbCBmb3JtIGZpZWxkc1xuICovXG5jb25zdCBzZXRGaWVsZHNFbmFibGVkID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmllbGQuZW5hYmxlKCk7XG4gICAgfSBlbHNlIGlmICghZW5hYmxlZCAmJiB0eXBlb2YgZmllbGQuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldHMgY29udHJvbCBidXR0b24gY29tcG9uZW50cyBmcm9tIHRoZSBVSSByZWdpc3RyeVxuICovXG5jb25zdCBnZXRDb250cm9sQnV0dG9ucyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb250cm9sTmFtZXM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgRm9ybUZpZWxkPiA9PiB7XG4gIGNvbnN0IGNvbnRyb2xzID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgY29udHJvbE5hbWVzKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHVpW25hbWVdO1xuICAgIGlmIChjb250cm9sICYmIHR5cGVvZiBjb250cm9sID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIGNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2xzLnNldChuYW1lLCBjb250cm9sIGFzIEZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xzO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGNvbnRyb2wgYnV0dG9uc1xuICovXG5jb25zdCBzZXRDb250cm9sc0VuYWJsZWQgPSAoXG4gIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgY29udHJvbF0gb2YgY29udHJvbHMpIHtcbiAgICBpZiAoZW5hYmxlZCAmJiB0eXBlb2YgY29udHJvbC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmRpc2FibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhDb250cm9sbGVyIGZlYXR1cmVcbiAqIEFkZHMgY29udHJvbCBidXR0b24gaGFuZGxpbmcgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQ29udHJvbGxlciA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPjtcbiAgICBnZXREYXRhU3RhdGU6ICgpID0+IHN0cmluZztcbiAgICBlbmFibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgRk9STV9ERUZBVUxUUy5wcmVmaXg7XG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcbiAgICBjb25zdCBjb250cm9sTmFtZXMgPSBjb25maWcuY29udHJvbHNcbiAgICAgID8gWy4uLmNvbmZpZy5jb250cm9sc11cbiAgICAgIDogWy4uLkZPUk1fREVGQVVMVFMuY29udHJvbHNdO1xuXG4gICAgLy8gR2V0IGNvbnRyb2wgYnV0dG9ucyBmcm9tIFVJXG4gICAgY29uc3QgY29udHJvbHMgPSBjb250cm9sTmFtZXNcbiAgICAgID8gZ2V0Q29udHJvbEJ1dHRvbnMoY29tcG9uZW50LnVpIHx8IHt9LCBjb250cm9sTmFtZXMpXG4gICAgICA6IG5ldyBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+KCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbnRyb2xzIGFzIGRpc2FibGVkIChwcmlzdGluZSBzdGF0ZSlcbiAgICBpZiAoY29udHJvbHMuc2l6ZSA+IDApIHtcbiAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgY29udHJvbHMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGN1cnJlbnQgZGF0YSBzdGF0ZSAocHJpc3RpbmUgb3IgZGlydHkpXG4gICAgICAgKi9cbiAgICAgIGdldERhdGFTdGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkXG4gICAgICAgICAgPyBEQVRBX1NUQVRFLkRJUlRZXG4gICAgICAgICAgOiBEQVRBX1NUQVRFLlBSSVNUSU5FO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUNvbnRyb2xzKCk6IHZvaWQge1xuICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCB0cnVlKTtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVGaWVsZHMoKTogdm9pZCB7XG4gICAgICAgIHNldEZpZWxkc0VuYWJsZWQoY29tcG9uZW50LmZpZWxkcywgZmFsc2UpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBzdGF0ZSBjaGFuZ2VzIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzXG4gICAgaWYgKGNvbmZpZy51c2VDaGFuZ2VzICE9PSBmYWxzZSAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcbiAgICAgICAgRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLFxuICAgICAgICAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW47IHN0YXRlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5tb2RpZmllZCkge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBkaXJ0eSAtIGVuYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBwcmlzdGluZSAtIGRpc2FibGUgY29udHJvbHNcbiAgICAgICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBDU1MgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlQ2xhc3MoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgICAgICAgICBldmVudC5tb2RpZmllZCxcbiAgICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhDb250cm9sbGVyO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL3N1Ym1pdC50c1xuXG4vKipcbiAqIFN1Ym1pdCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBmb3JtIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtRGF0YSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgRm9ybVZhbGlkYXRpb25SdWxlLFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIEZPUk1fQ0xBU1NFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGhlYWRlcnMgZm9yIEpTT04gcmVxdWVzdHNcbiAqL1xuY29uc3QgREVGQVVMVF9IRUFERVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGZvcm0gZGF0YSBhZ2FpbnN0IHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhID0gKFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgcnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdLFxuKTogRm9ybVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IHZhbGlkID0gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFbcnVsZS5maWVsZF07XG4gICAgY29uc3QgcmVzdWx0ID0gcnVsZS52YWxpZGF0ZSh2YWx1ZSwgZGF0YSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIGVycm9yc1tydWxlLmZpZWxkXSA9IHJ1bGUubWVzc2FnZSB8fCBgJHtydWxlLmZpZWxkfSBpcyBpbnZhbGlkYDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICBlcnJvcnNbcnVsZS5maWVsZF0gPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdmFsaWQsIGVycm9ycyB9O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgYWN0dWFsIEhUVFAgcmVxdWVzdFxuICovXG5jb25zdCBwZXJmb3JtUmVxdWVzdCA9IGFzeW5jIChcbiAgdXJsOiBzdHJpbmcsXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBvcHRpb25zOiBGb3JtU3VibWl0T3B0aW9ucyxcbik6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCBcIlBPU1RcIjtcbiAgY29uc3QgaGVhZGVycyA9IHsgLi4uREVGQVVMVF9IRUFERVJTLCAuLi5vcHRpb25zLmhlYWRlcnMgfTtcblxuICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICB9O1xuXG4gIC8vIEFkZCBib2R5IGZvciBub24tR0VUIHJlcXVlc3RzXG4gIGlmIChtZXRob2QgIT09IFwiR0VUXCIpIHtcbiAgICBmZXRjaE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucyk7XG5cbiAgLy8gUGFyc2UgcmVzcG9uc2VcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKTtcbiAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBIVFRQIGVycm9yc1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgKGVycm9yIGFzIEVycm9yICYgeyByZXNwb25zZTogdW5rbm93biB9KS5yZXNwb25zZSA9IHJlc3VsdDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIHdpdGhTdWJtaXQgZmVhdHVyZVxuICogQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aFN1Ym1pdCA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICAgIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgICAgZ2V0TW9kaWZpZWREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICAgIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICAgIHNuYXBzaG90OiAoKSA9PiB2b2lkO1xuICAgICAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gICAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgICBjbGVhckVycm9yczogKCkgPT4gdm9pZDtcbiAgICBzZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgICBnZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9ID0+IHtcbiAgICAvLyBWYWxpZGF0aW9uIHJ1bGVzIGNhbiBiZSB1cGRhdGVkIGF0IHJ1bnRpbWVcbiAgICBsZXQgdmFsaWRhdGlvblJ1bGVzID0gY29uZmlnLnZhbGlkYXRpb24gfHwgW107XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBWYWxpZGF0ZSBmb3JtIGRhdGEgYWdhaW5zdCBjb25maWd1cmVkIHJ1bGVzXG4gICAgICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHZhbGlkIGZsYWcgYW5kIGVycm9ycyBvYmplY3RcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGUoKTogRm9ybVZhbGlkYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVEYXRhKGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0YXRlIHdpdGggdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHJlc3VsdC5lcnJvcnM7XG5cbiAgICAgICAgLy8gRW1pdCB2YWxpZGF0aW9uIGV2ZW50IGlmIHRoZXJlIGFyZSBlcnJvcnNcbiAgICAgICAgaWYgKCFyZXN1bHQudmFsaWQpIHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlZBTElEQVRJT05fRVJST1IsIHJlc3VsdC5lcnJvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU3VibWl0IHRoZSBmb3JtXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHN1Ym1pdCBjb25maWd1cmF0aW9uXG4gICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc2VydmVyIHJlc3BvbnNlXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHN1Ym1pdChvcHRpb25zOiBGb3JtU3VibWl0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIC8vIFByZXZlbnQgZG91YmxlIHN1Ym1pc3Npb25cbiAgICAgICAgaWYgKGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZvcm0gaXMgYWxyZWFkeSBzdWJtaXR0aW5nXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGlmIHJlcXVlc3RlZCAoZGVmYXVsdDogdHJ1ZSlcbiAgICAgICAgaWYgKG9wdGlvbnMudmFsaWRhdGUgIT09IGZhbHNlICYmIHZhbGlkYXRpb25SdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0aW9uIGZhaWxlZFwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBhcyBzdWJtaXR0aW5nXG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBBZGQgc3VibWl0dGluZyBjbGFzcyB0byBlbGVtZW50XG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IFwiZm9ybVwiO1xuICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzdWJtaXQgZXZlbnRcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlULCBkYXRhKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgICAgICAgICAvLyBVc2UgY3VzdG9tIGhhbmRsZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBvcHRpb25zLmhhbmRsZXIoXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGNvbXBvbmVudCBhcyB1bmtub3duIGFzIGltcG9ydChcIi4uL3R5cGVzXCIpLkZvcm1Db21wb25lbnQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmFjdGlvbikge1xuICAgICAgICAgICAgLy8gVXNlIGRlZmF1bHQgZmV0Y2hcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHBlcmZvcm1SZXF1ZXN0KGNvbmZpZy5hY3Rpb24sIGRhdGEsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCB8fCBjb25maWcubWV0aG9kIHx8IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gYWN0aW9uIFVSTCwganVzdCByZXR1cm4gdGhlIGRhdGFcbiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3VjY2VzcyFcbiAgICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSB7fTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBzdWJtaXR0aW5nIGNsYXNzXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IFwibXRybFwiO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IFwiZm9ybVwiO1xuICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICAgICAgICAgYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5TVUJNSVRUSU5HfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRha2Ugc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIG5ldyBiYXNlbGluZVxuICAgICAgICAgIC8vIFRoaXMgcmVzZXRzIG1vZGlmaWVkIHN0YXRlIHRvIGZhbHNlLCB3aGljaCB3aWxsIHRyaWdnZXIgc3RhdGU6Y2hhbmdlXG4gICAgICAgICAgY29tcG9uZW50LnNuYXBzaG90KCk7XG5cbiAgICAgICAgICAvLyBEaXNhYmxlIGNvbnRyb2xzIChmb3JtIGlzIG5vdyBwcmlzdGluZSlcbiAgICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzKCk7XG5cbiAgICAgICAgICAvLyBFbWl0IHN1Y2Nlc3MgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVF9TVUNDRVNTLCByZXN1bHQpO1xuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBFcnJvciFcbiAgICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN1Ym1pdHRpbmcgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlUX0VSUk9SLCBlcnJvcik7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgdmFsaWRhdGlvbiBydWxlcyBhdCBydW50aW1lXG4gICAgICAgKi9cbiAgICAgIHNldFZhbGlkYXRpb25SdWxlcyhydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10pOiB2b2lkIHtcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzID0gcnVsZXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICovXG4gICAgICBjbGVhckVycm9ycygpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHt9O1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYW4gZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdID0gZXJyb3I7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCB0aGUgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgdmFsaWRhdGVEYXRhLCBwZXJmb3JtUmVxdWVzdCB9O1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN1Ym1pdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9hcGkudHNcblxuLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIHVuaWZpZWQgcHVibGljIEFQSSBmb3IgdGhlIGZvcm1cbiAqIEFsc28gd2lyZXMgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnMgKHN1Ym1pdC9jYW5jZWwpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIERhdGFTdGF0ZSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGQsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogV2lyZXMgdXAgY2xpY2sgaGFuZGxlcnMgZm9yIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwpXG4gKi9cbmNvbnN0IHdpcmVDb250cm9sQnV0dG9ucyA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGFwaTogRm9ybUNvbXBvbmVudCxcbiAgY29uZmlnOiBGb3JtQ29uZmlnLFxuKTogdm9pZCA9PiB7XG4gIC8vIFdpcmUgc3VibWl0IGJ1dHRvblxuICBjb25zdCBzdWJtaXRCdXR0b24gPSBjb250cm9scy5nZXQoXCJzdWJtaXRcIik7XG4gIGlmIChzdWJtaXRCdXR0b24/LmVsZW1lbnQpIHtcbiAgICBzdWJtaXRCdXR0b24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5vblN1Ym1pdCkge1xuICAgICAgICAvLyBVc2UgY3VzdG9tIHN1Ym1pdCBoYW5kbGVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGFwaS5nZXREYXRhKCk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnLm9uU3VibWl0KGRhdGEsIGFwaSk7XG4gICAgICAgICAgLy8gQWZ0ZXIgc3VjY2Vzc2Z1bCBzdWJtaXQsIGRpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGFwaS5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRm9ybSBzdWJtaXQgZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAvLyBPbiBlcnJvciwgYWxzbyBkaXNhYmxlIGNvbnRyb2xzIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2xpY2tzXG4gICAgICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2UgZGVmYXVsdCBmb3JtIHN1Ym1pdCAoaGFuZGxlcyBkaXNhYmxpbmcgaW50ZXJuYWxseSlcbiAgICAgICAgYXdhaXQgYXBpLnN1Ym1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2lyZSBjYW5jZWwgYnV0dG9uXG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IGNvbnRyb2xzLmdldChcImNhbmNlbFwiKTtcbiAgaWYgKGNhbmNlbEJ1dHRvbj8uZWxlbWVudCkge1xuICAgIGNhbmNlbEJ1dHRvbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLm9uQ2FuY2VsKSB7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gY2FuY2VsIGhhbmRsZXJcbiAgICAgICAgY29uZmlnLm9uQ2FuY2VsKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0OiByZXNldCBmb3JtIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgICAgYXBpLnJlc2V0KCk7XG4gICAgICB9XG4gICAgICAvLyBBZnRlciBjYW5jZWwsIGRpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIEV4dGVuZGVkIGNvbXBvbmVudCBpbnRlcmZhY2UgYmVmb3JlIEFQSSBpcyBhcHBsaWVkXG4gKi9cbmludGVyZmFjZSBFbmhhbmNlZEZvcm1Db21wb25lbnQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCB7XG4gIGZvcm06IEhUTUxGb3JtRWxlbWVudDtcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICBmaWxlczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gIHN0YXRlOiBGb3JtU3RhdGU7XG4gIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+O1xuXG4gIC8vIERhdGEgbWV0aG9kc1xuICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgc2V0RGF0YTogKGRhdGE6IEZvcm1EYXRhLCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICBnZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nKSA9PiBGaWVsZFZhbHVlO1xuICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgaXNNb2RpZmllZDogKCkgPT4gYm9vbGVhbjtcbiAgZ2V0TW9kaWZpZWREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gIHJlc2V0OiAoKSA9PiB2b2lkO1xuICBjbGVhcjogKCkgPT4gdm9pZDtcblxuICAvLyBGaWVsZCBtZXRob2RzXG4gIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gIGdldEZpZWxkTmFtZXM6ICgpID0+IHN0cmluZ1tdO1xuICBoYXNGaWVsZDogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvLyBDb250cm9sbGVyIG1ldGhvZHNcbiAgZ2V0RGF0YVN0YXRlOiAoKSA9PiBEYXRhU3RhdGU7XG4gIGVuYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gIGVuYWJsZUZpZWxkczogKCkgPT4gdm9pZDtcbiAgZGlzYWJsZUZpZWxkczogKCkgPT4gdm9pZDtcblxuICAvLyBTdWJtaXQgbWV0aG9kc1xuICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gIHN1Ym1pdDogKG9wdGlvbnM/OiBGb3JtU3VibWl0T3B0aW9ucykgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgc2V0VmFsaWRhdGlvblJ1bGVzOiAocnVsZXM6IGltcG9ydChcIi4uL3R5cGVzXCIpLkZvcm1WYWxpZGF0aW9uUnVsZVtdKSA9PiB2b2lkO1xuICBjbGVhckVycm9yczogKCkgPT4gdm9pZDtcbiAgc2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRXZlbnQgbWV0aG9kc1xuICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgb2ZmPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuXG4gIC8vIExpZmVjeWNsZVxuICBsaWZlY3ljbGU/OiB7XG4gICAgZGVzdHJveTogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiB3aXRoQVBJIGZlYXR1cmVcbiAqIENyZWF0ZXMgYSBjbGVhbiBwdWJsaWMgQVBJIGZvciB0aGUgZm9ybSBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBFbmhhbmNlZEZvcm1Db21wb25lbnQpOiBGb3JtQ29tcG9uZW50ID0+IHtcbiAgICAvLyBSZWdpc3RlciBldmVudCBoYW5kbGVycyBmcm9tIGNvbmZpZ1xuICAgIGlmIChjb25maWcub24gJiYgY29tcG9uZW50Lm9uKSB7XG4gICAgICBmb3IgKGNvbnN0IFtldmVudCwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLm9uKSkge1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbXBvbmVudC5vbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIHB1YmxpYyBBUElcbiAgICBjb25zdCBhcGk6IEZvcm1Db21wb25lbnQgPSB7XG4gICAgICAvLyBDb3JlIHByb3BlcnRpZXNcbiAgICAgIGVsZW1lbnQ6IGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgZm9ybTogY29tcG9uZW50LmZvcm0sXG4gICAgICB1aTogY29tcG9uZW50LnVpLFxuICAgICAgZmllbGRzOiBjb21wb25lbnQuZmllbGRzLFxuICAgICAgc3RhdGU6IGNvbXBvbmVudC5zdGF0ZSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBEYXRhIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGFsbCBmb3JtIGRhdGEgYXMgYSBrZXktdmFsdWUgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIGdldERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGZvcm0gZGF0YSBmcm9tIGEga2V5LXZhbHVlIG9iamVjdFxuICAgICAgICogQHBhcmFtIGRhdGEgLSBEYXRhIHRvIHNldFxuICAgICAgICogQHBhcmFtIHNpbGVudCAtIElmIHRydWUsIGRvbid0IGVtaXQgY2hhbmdlIGV2ZW50c1xuICAgICAgICovXG4gICAgICBzZXREYXRhKGRhdGE6IEZvcm1EYXRhLCBzaWxlbnQ/OiBib29sZWFuKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5zZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZFZhbHVlKG5hbWU6IHN0cmluZyk6IEZpZWxkVmFsdWUge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkVmFsdWUobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gRmllbGQgbmFtZVxuICAgICAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzXG4gICAgICAgKi9cbiAgICAgIHNldEZpZWxkVmFsdWUoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gICAgICAgIHNpbGVudD86IGJvb2xlYW4sXG4gICAgICApOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LnNldEZpZWxkVmFsdWUobmFtZSwgdmFsdWUsIHNpbGVudCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIGZpZWxkIGNvbXBvbmVudCBieSBuYW1lXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIEZpZWxkIG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGQobmFtZTogc3RyaW5nKTogRm9ybUZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZChuYW1lKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGFsbCBmaWVsZCBuYW1lc1xuICAgICAgICovXG4gICAgICBnZXRGaWVsZE5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZE5hbWVzKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGZvcm0gaGFzIGJlZW4gbW9kaWZpZWQgZnJvbSBpbml0aWFsL3NuYXBzaG90IHN0YXRlXG4gICAgICAgKi9cbiAgICAgIGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuaXNNb2RpZmllZCgpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBTdGF0ZSBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCB0aGUgY3VycmVudCBkYXRhIHN0YXRlIChwcmlzdGluZSBvciBkaXJ0eSlcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YVN0YXRlKCk6IERhdGFTdGF0ZSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YVN0YXRlKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFZhbGlkYXRpb24gQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBWYWxpZGF0ZSB0aGUgZm9ybSBhZ2FpbnN0IGNvbmZpZ3VyZWQgcnVsZXNcbiAgICAgICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggdmFsaWQgZmxhZyBhbmQgZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIHZhbGlkYXRlKCk6IEZvcm1WYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52YWxpZGF0ZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBTdWJtaXQgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBTdWJtaXQgdGhlIGZvcm1cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc3VibWl0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc3VibWl0KG9wdGlvbnM/OiBGb3JtU3VibWl0T3B0aW9ucyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN1Ym1pdChvcHRpb25zKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gU3RhdGUgTWFuYWdlbWVudCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc2V0IGZvcm0gdG8gaW5pdGlhbC9zbmFwc2hvdCBzdGF0ZVxuICAgICAgICovXG4gICAgICByZXNldCgpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LnJlc2V0KCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBjbGVhcigpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZW5hYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGUoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5kaXNhYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdCwgY2FuY2VsLCBldGMuKVxuICAgICAgICovXG4gICAgICBlbmFibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmVuYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBFdmVudCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKi9cbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vbj8uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vZmY/LihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVtaXQgYW4gZXZlbnRcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRXZlbnQgZGF0YVxuICAgICAgICovXG4gICAgICBlbWl0KGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBMaWZlY3ljbGUgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBEZXN0cm95IHRoZSBmb3JtIGFuZCBjbGVhbiB1cCByZXNvdXJjZXNcbiAgICAgICAqL1xuICAgICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGZpZWxkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGZpZWxkXSBvZiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250cm9sIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGNvbnRyb2xdIG9mIGNvbXBvbmVudC5jb250cm9scykge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29udHJvbC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChjb21wb25lbnQubGlmZWN5Y2xlPy5kZXN0cm95KSB7XG4gICAgICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZm9ybSBlbGVtZW50IGZyb20gRE9NXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudD8ucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBkZXN0cm95IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gV2lyZSB1cCBjb250cm9sIGJ1dHRvbiBjbGljayBoYW5kbGVyc1xuICAgIHdpcmVDb250cm9sQnV0dG9ucyhjb21wb25lbnQuY29udHJvbHMsIGFwaSwgY29uZmlnKTtcblxuICAgIHJldHVybiBhcGk7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoQVBJO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJPLFNBQVMsV0FBVyxDQUN6QixJQUNBLElBQ0EsSUFDQSxJQUNRO0FBQUEsRUFDUixPQUFPLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUFBO0FBWXZELFNBQVMsUUFBUSxDQUN0QixJQUNBLElBQ0EsSUFDQSxJQUNRO0FBQUEsRUFDUixNQUFNLFFBQVMsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsSUFBSSxNQUFPLEtBQUs7QUFBQSxFQUMxRCxPQUFPLFFBQVEsSUFBSSxRQUFRLE1BQU07QUFBQTtBQVc1QixTQUFT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QyxPQUFlLFNBQWtDO0FBQUEsUUFDbEQsV0FBVSxLQUFLLE9BQU8sT0FBTztBQUFBLFFBQzdCLE9BQU87QUFBQTtBQUFBLE1BUVQsR0FBRyxDQUFDLE9BQWUsU0FBa0M7QUFBQSxRQUNuRCxXQUFVLE1BQU0sT0FBTyxPQUFPO0FBQUEsUUFDOUIsT0FBTztBQUFBO0FBQUEsTUFRVCxJQUFJLENBQUMsT0FBZSxNQUFzQjtBQUFBLFFBQ3hDLFdBQVUsT0FBTyxPQUFPLElBQUk7QUFBQTtBQUFBLE1BVTlCLE9BQU8sR0FBUztBQUFBLFFBRWQsY0FBYyxVQUFVLFdBQVUsUUFBUTtBQUFBLFVBQ3hDLElBQUksT0FBTyxNQUFNLFlBQVksWUFBWTtBQUFBLFlBQ3ZDLE1BQU0sUUFBUTtBQUFBLFVBQ2hCO0FBQUEsUUFDRjtBQUFBLFFBR0EsY0FBYyxZQUFZLFdBQVUsVUFBVTtBQUFBLFVBQzVDLElBQUksT0FBTyxRQUFRLFlBQVksWUFBWTtBQUFBLFlBQ3pDLFFBQVEsUUFBUTtBQUFBLFVBQ2xCO0FBQUEsUUFDRjtBQUFBLFFBR0EsSUFBSSxXQUFVLFdBQVcsU0FBUztBQUFBLFVBQ2hDLFdBQVUsVUFBVSxRQUFRO0FBQUEsUUFDOUI7QUFBQSxRQUdBLElBQUksV0FBVSxTQUFTLFlBQVk7QUFBQSxVQUNqQyxXQUFVLFFBQVEsV0FBVyxZQUFZLFdBQVUsT0FBTztBQUFBLFFBQzVEO0FBQUEsUUFHQSxXQUFVLE9BQU8sWUFBWSxLQUFLO0FBQUE7QUFBQSxJQUV0QztBQUFBLElBR0EsbUJBQW1CLFdBQVUsVUFBVSxLQUFLLE1BQU07QUFBQSxJQUVsRCxPQUFPO0FBQUE7QUFBQTs7QVJsU0osSUFBTSxhQUFhLENBQUMsU0FBcUIsQ0FBQyxNQUFxQjtBQUFBLEVBQ3BFLElBQUk7QUFBQSxJQUVGLE1BQU0sYUFBYSxpQkFBaUIsTUFBTTtBQUFBLElBSTFDLE1BQU0sYUFBWSxtQkFFaEIsMEJBR0EseUJBQVcsR0FHWCwwQkFBWSxpQkFBaUIsVUFBVSxDQUFDLEdBR3hDLFdBQVcsVUFBVSxHQUdyQixXQUFXLFVBQVUsR0FHckIsU0FBUyxVQUFVLEdBR25CLGVBQWUsVUFBVSxHQUd6QixXQUFXLFVBQVUsR0FHckIsNEJBQWMsR0FHZCxTQUFRLFVBQVUsQ0FDcEIsRUFBRSxVQUFVO0FBQUEsSUFHWixJQUFJLE9BQU8sYUFBYSxXQUFVLFNBQVM7QUFBQSxNQUN6QyxPQUFPLFVBQVUsWUFBWSxXQUFVLE9BQU87QUFBQSxJQUNoRDtBQUFBLElBRUEsT0FBTztBQUFBLElBQ1AsT0FBTyxPQUFPO0FBQUEsSUFDZCxRQUFRLE1BQU0sd0JBQXdCLEtBQUs7QUFBQSxJQUMzQyxNQUFNLElBQUksTUFBTSwwQkFBMkIsTUFBZ0IsU0FBUztBQUFBO0FBQUE7IiwKICAiZGVidWdJZCI6ICIwOEJFOUY0MUIxODYxNDdENjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==