cacophony 0.34.0 → 0.36.0

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.
Files changed (210) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +35 -2
  3. package/dist/bundles/barberpole-bundle.js_url.cjs +1 -1
  4. package/dist/bundles/barberpole-bundle.js_url.cjs.map +1 -1
  5. package/dist/bundles/barberpole-bundle.js_url.mjs +1 -1
  6. package/dist/bundles/barberpole-bundle.js_url.mjs.map +1 -1
  7. package/dist/bundles/dattorro-reverb-bundle.js_url.cjs +1 -1
  8. package/dist/bundles/dattorro-reverb-bundle.js_url.cjs.map +1 -1
  9. package/dist/bundles/dattorro-reverb-bundle.js_url.mjs +1 -1
  10. package/dist/bundles/dattorro-reverb-bundle.js_url.mjs.map +1 -1
  11. package/dist/bundles/dynamics-bundle.js_url.cjs +1 -1
  12. package/dist/bundles/dynamics-bundle.js_url.cjs.map +1 -1
  13. package/dist/bundles/dynamics-bundle.js_url.mjs +1 -1
  14. package/dist/bundles/dynamics-bundle.js_url.mjs.map +1 -1
  15. package/dist/bundles/fdn-reverb-bundle.js_url.cjs +1 -1
  16. package/dist/bundles/fdn-reverb-bundle.js_url.cjs.map +1 -1
  17. package/dist/bundles/fdn-reverb-bundle.js_url.mjs +1 -1
  18. package/dist/bundles/fdn-reverb-bundle.js_url.mjs.map +1 -1
  19. package/dist/bundles/frequency-shifter-bundle.js_url.cjs +1 -1
  20. package/dist/bundles/frequency-shifter-bundle.js_url.cjs.map +1 -1
  21. package/dist/bundles/frequency-shifter-bundle.js_url.mjs +1 -1
  22. package/dist/bundles/frequency-shifter-bundle.js_url.mjs.map +1 -1
  23. package/dist/bundles/harmonizer-bundle.js_url.cjs +1 -1
  24. package/dist/bundles/harmonizer-bundle.js_url.cjs.map +1 -1
  25. package/dist/bundles/harmonizer-bundle.js_url.mjs +1 -1
  26. package/dist/bundles/harmonizer-bundle.js_url.mjs.map +1 -1
  27. package/dist/bundles/modulated-delay-bundle.js_url.cjs +1 -1
  28. package/dist/bundles/modulated-delay-bundle.js_url.cjs.map +1 -1
  29. package/dist/bundles/modulated-delay-bundle.js_url.mjs +1 -1
  30. package/dist/bundles/modulated-delay-bundle.js_url.mjs.map +1 -1
  31. package/dist/bundles/phaser-bundle.js_url.cjs +1 -1
  32. package/dist/bundles/phaser-bundle.js_url.cjs.map +1 -1
  33. package/dist/bundles/phaser-bundle.js_url.mjs +1 -1
  34. package/dist/bundles/phaser-bundle.js_url.mjs.map +1 -1
  35. package/dist/bundles/spectral-freeze-bundle.js_url.cjs +1 -1
  36. package/dist/bundles/spectral-freeze-bundle.js_url.cjs.map +1 -1
  37. package/dist/bundles/spectral-freeze-bundle.js_url.mjs +1 -1
  38. package/dist/bundles/spectral-freeze-bundle.js_url.mjs.map +1 -1
  39. package/dist/bundles/stereo-widener-bundle.js_url.cjs +1 -1
  40. package/dist/bundles/stereo-widener-bundle.js_url.cjs.map +1 -1
  41. package/dist/bundles/stereo-widener-bundle.js_url.mjs +1 -1
  42. package/dist/bundles/stereo-widener-bundle.js_url.mjs.map +1 -1
  43. package/dist/bundles/tremolo-bundle.js_url.cjs +1 -1
  44. package/dist/bundles/tremolo-bundle.js_url.cjs.map +1 -1
  45. package/dist/bundles/tremolo-bundle.js_url.mjs +1 -1
  46. package/dist/bundles/tremolo-bundle.js_url.mjs.map +1 -1
  47. package/dist/bundles/waveshaper-bundle.js_url.cjs +1 -1
  48. package/dist/bundles/waveshaper-bundle.js_url.cjs.map +1 -1
  49. package/dist/bundles/waveshaper-bundle.js_url.mjs +1 -1
  50. package/dist/bundles/waveshaper-bundle.js_url.mjs.map +1 -1
  51. package/dist/effects.cjs +1 -1
  52. package/dist/effects.cjs.map +1 -1
  53. package/dist/effects.d.ts +2 -2
  54. package/dist/effects.mjs +68 -49
  55. package/dist/effects.mjs.map +1 -1
  56. package/dist/index.d.ts +1 -0
  57. package/dist/playback.cjs +1 -1
  58. package/dist/playback.cjs.map +1 -1
  59. package/dist/playback.d.ts +20 -0
  60. package/dist/playback.mjs +91 -11
  61. package/dist/playback.mjs.map +1 -1
  62. package/docs/assets/hierarchy.js +1 -1
  63. package/docs/assets/navigation.js +1 -1
  64. package/docs/assets/search.js +1 -1
  65. package/docs/classes/AudioCache.html +4 -4
  66. package/docs/classes/AudioSprite.html +7 -7
  67. package/docs/classes/BarberpoleEffect.html +8 -8
  68. package/docs/classes/BiquadEffect.html +3 -3
  69. package/docs/classes/Bus.html +21 -21
  70. package/docs/classes/Cacophony.html +92 -92
  71. package/docs/classes/DynamicsEffect.html +8 -8
  72. package/docs/classes/FdnReverbEffect.html +8 -8
  73. package/docs/classes/FoaDecoder.html +5 -5
  74. package/docs/classes/FoaDecoderEffect.html +3 -3
  75. package/docs/classes/FrequencyShifterEffect.html +8 -8
  76. package/docs/classes/Group.html +33 -33
  77. package/docs/classes/HarmonizerEffect.html +8 -8
  78. package/docs/classes/ImpulseResponseEffect.html +3 -3
  79. package/docs/classes/KWeightingFilter.html +4 -4
  80. package/docs/classes/LoudnessMeter.html +11 -11
  81. package/docs/classes/MediaStreamPlayback.html +70 -70
  82. package/docs/classes/MediaStreamSound.html +51 -51
  83. package/docs/classes/MicrophoneStream.html +52 -52
  84. package/docs/classes/ModulatedDelayEffect.html +8 -8
  85. package/docs/classes/PcmStreamPlayback.html +70 -70
  86. package/docs/classes/PcmStreamSound.html +61 -61
  87. package/docs/classes/PhaserEffect.html +8 -8
  88. package/docs/classes/Playback.html +112 -88
  89. package/docs/classes/ReverbEffect.html +8 -8
  90. package/docs/classes/Scheduler.html +3 -3
  91. package/docs/classes/ShareEffect.html +3 -3
  92. package/docs/classes/Sound.html +72 -72
  93. package/docs/classes/SpectralFreezeEffect.html +8 -8
  94. package/docs/classes/StereoWidenerEffect.html +5 -5
  95. package/docs/classes/Synth.html +63 -63
  96. package/docs/classes/SynthGroup.html +28 -28
  97. package/docs/classes/TremoloEffect.html +8 -8
  98. package/docs/classes/TruePeakDetector.html +8 -8
  99. package/docs/classes/WaveshaperEffect.html +8 -8
  100. package/docs/functions/encodeMonoToFoaSN3D.html +1 -1
  101. package/docs/functions/integratedLoudness.html +1 -1
  102. package/docs/functions/integratedUngatedLoudness.html +1 -1
  103. package/docs/functions/loudnessRange.html +1 -1
  104. package/docs/functions/timeStretch.html +1 -1
  105. package/docs/functions/timeStretchChannels.html +1 -1
  106. package/docs/functions/truePeakDb.html +1 -1
  107. package/docs/hierarchy.html +3 -3
  108. package/docs/index.html +26 -0
  109. package/docs/interfaces/AudioBuffer.html +8 -8
  110. package/docs/interfaces/AudioBufferSourceNode.html +21 -21
  111. package/docs/interfaces/AudioEventCallbacks.html +1 -1
  112. package/docs/interfaces/AudioListener.html +12 -12
  113. package/docs/interfaces/AudioNode.html +13 -13
  114. package/docs/interfaces/AudioParam.html +7 -7
  115. package/docs/interfaces/AudioWorklet.html +2 -2
  116. package/docs/interfaces/AudioWorkletNode.html +15 -15
  117. package/docs/interfaces/BarberpoleOptions.html +5 -5
  118. package/docs/interfaces/BaseContext.html +25 -25
  119. package/docs/interfaces/BaseSound.html +16 -16
  120. package/docs/interfaces/BiquadCoefficients.html +6 -6
  121. package/docs/interfaces/BiquadFilterNode.html +19 -19
  122. package/docs/interfaces/BuiltEffectGraph.html +6 -6
  123. package/docs/interfaces/CacheErrorEvent.html +5 -5
  124. package/docs/interfaces/CacheHitEvent.html +4 -4
  125. package/docs/interfaces/CacheMissEvent.html +4 -4
  126. package/docs/interfaces/CacophonyEffect.html +2 -2
  127. package/docs/interfaces/CacophonyLogger.html +4 -4
  128. package/docs/interfaces/ChannelMergerNode.html +13 -13
  129. package/docs/interfaces/ChannelSplitterNode.html +13 -13
  130. package/docs/interfaces/ConvolverNode.html +15 -15
  131. package/docs/interfaces/CreateSpriteOptions.html +3 -3
  132. package/docs/interfaces/DeviceChangeEvent.html +3 -3
  133. package/docs/interfaces/DynamicsOptions.html +7 -7
  134. package/docs/interfaces/FadeStartEvent.html +4 -4
  135. package/docs/interfaces/FdnReverbOptions.html +6 -6
  136. package/docs/interfaces/FoaDecoderOptions.html +2 -2
  137. package/docs/interfaces/FrequencyShifterOptions.html +3 -3
  138. package/docs/interfaces/GainNode.html +14 -14
  139. package/docs/interfaces/GlobalPlaybackEvent.html +3 -3
  140. package/docs/interfaces/HarmonizerOptions.html +6 -6
  141. package/docs/interfaces/ImpulseResponseOptions.html +5 -5
  142. package/docs/interfaces/LoadingCompleteEvent.html +5 -5
  143. package/docs/interfaces/LoadingErrorEvent.html +5 -5
  144. package/docs/interfaces/LoadingProgressEvent.html +6 -6
  145. package/docs/interfaces/LoadingStartEvent.html +3 -3
  146. package/docs/interfaces/LoudnessChannelInput.html +3 -3
  147. package/docs/interfaces/LoudnessReading.html +5 -5
  148. package/docs/interfaces/MediaElementSourceNode.html +14 -14
  149. package/docs/interfaces/MediaStreamAudioSourceNode.html +14 -14
  150. package/docs/interfaces/MediaStreamSoundOptions.html +4 -4
  151. package/docs/interfaces/MicrophoneStreamOptions.html +7 -7
  152. package/docs/interfaces/ModulatedDelayOptions.html +8 -8
  153. package/docs/interfaces/OfflineOptions.html +5 -5
  154. package/docs/interfaces/OscillatorNode.html +19 -19
  155. package/docs/interfaces/PannerNode.html +27 -27
  156. package/docs/interfaces/PcmStreamBufferEvent.html +2 -2
  157. package/docs/interfaces/PcmStreamSoundOptions.html +6 -6
  158. package/docs/interfaces/PhaserOptions.html +7 -7
  159. package/docs/interfaces/PlayOptions.html +13 -13
  160. package/docs/interfaces/PlaybackErrorEvent.html +5 -5
  161. package/docs/interfaces/PrepareSeekOptions.html +65 -0
  162. package/docs/interfaces/ReverbOptions.html +13 -13
  163. package/docs/interfaces/RuntimeOptions.html +8 -8
  164. package/docs/interfaces/ScheduledCallbackHandle.html +2 -2
  165. package/docs/interfaces/SendGainOptions.html +3 -3
  166. package/docs/interfaces/SoundCleanupHoldings.html +4 -4
  167. package/docs/interfaces/SoundErrorEvent.html +6 -6
  168. package/docs/interfaces/SpectralFreezeOptions.html +4 -4
  169. package/docs/interfaces/SpriteRegion.html +4 -4
  170. package/docs/interfaces/StereoPannerNode.html +14 -14
  171. package/docs/interfaces/StereoToBFormatOptions.html +2 -2
  172. package/docs/interfaces/StereoWidenerOptions.html +4 -4
  173. package/docs/interfaces/StreamCapabilities.html +5 -5
  174. package/docs/interfaces/TimeStretchOptions.html +5 -5
  175. package/docs/interfaces/TremoloOptions.html +5 -5
  176. package/docs/interfaces/WaveshaperOptions.html +5 -5
  177. package/docs/modules.html +2 -2
  178. package/docs/types/AudioSinkId.html +1 -1
  179. package/docs/types/BaseAudioEvents.html +11 -11
  180. package/docs/types/BuiltEffect.html +1 -1
  181. package/docs/types/BusConnectionTarget.html +1 -1
  182. package/docs/types/CacheEventCallback.html +1 -1
  183. package/docs/types/CacophonyEvents.html +20 -20
  184. package/docs/types/ErrorEventCallback.html +1 -1
  185. package/docs/types/FadeType.html +1 -1
  186. package/docs/types/HrtfPannerOptions.html +1 -1
  187. package/docs/types/ImpulseResponseSource.html +1 -1
  188. package/docs/types/LoadingEventCallback.html +1 -1
  189. package/docs/types/LoopCount.html +1 -1
  190. package/docs/types/LoudnessChannel.html +1 -1
  191. package/docs/types/Orientation.html +3 -3
  192. package/docs/types/PanCloneOverrides.html +6 -6
  193. package/docs/types/PanType.html +1 -1
  194. package/docs/types/PcmStreamEvents.html +6 -6
  195. package/docs/types/PcmStreamState.html +1 -1
  196. package/docs/types/PlaybackEvents.html +1 -1
  197. package/docs/types/Position.html +1 -1
  198. package/docs/types/SoundEvents.html +1 -1
  199. package/docs/types/SoundType.html +1 -1
  200. package/docs/types/SourceNode.html +1 -1
  201. package/docs/types/SpriteMap.html +1 -1
  202. package/docs/types/SynthEvents.html +1 -1
  203. package/docs/types/ThreeDOptions.html +1 -1
  204. package/docs/types/WebCodecsStreamSound.html +1 -1
  205. package/docs/variables/CHANNEL_WEIGHTS.html +1 -1
  206. package/docs/variables/K_WEIGHTING_STAGE1_48K.html +1 -1
  207. package/docs/variables/K_WEIGHTING_STAGE2_48K.html +1 -1
  208. package/docs/variables/consoleLogger.html +1 -1
  209. package/docs/variables/noopLogger.html +1 -1
  210. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- var e=`data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIER5bmFtaWNzIEF1ZGlvV29ya2xldCBzaGVsbCDigJQgdGhpbiBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgdGhhdCBkZWxlZ2F0ZXMgQUxMCiAgICAgKiBEU1AgbWF0aCB0byB0aGUgY29udGV4dC1mcmVlIER5bmFtaWNzUHJvY2Vzc29yIGluIGR5bmFtaWNzLWNvcmUudHMuIE1pcnJvcnMKICAgICAqIHRoZSBkYXR0b3Jyby1yZXZlcmIudHMgLyBzdGVyZW8tdG8tYmZvcm1hdC50cyBjb3JlL3NoZWxsIHNwbGl0OiB0aGlzIGZpbGUKICAgICAqIG93bnMgb25seSB0aGUgd29ya2xldCBwbHVtYmluZyAocGFyYW1ldGVyRGVzY3JpcHRvcnMsIHByb2Nlc3MoKSwgdGhlCiAgICAgKiByZWdpc3RlclByb2Nlc3NvciBjYWxsKTsgdGhlIGFsZ29yaXRobSBsaXZlcyBpbiB0aGUgdW5pdC10ZXN0ZWQgY29yZS4KICAgICAqCiAgICAgKiBBbGdvcml0aG06IGZlZWQtZm9yd2FyZCBkeW5hbWljIHJhbmdlIGNvbXByZXNzb3IvbGltaXRlci9leHBhbmRlci9nYXRlIHBlcgogICAgICogR2lhbm5vdWxpcywgTWFzc2JlcmcgJiBSZWlzcyAyMDEyIChzZWUgZHluYW1pY3MtY29yZS50cyBoZWFkZXIgZm9yIHRoZSBmdWxsCiAgICAgKiBjaXRhdGlvbiBhbmQgcGVyLWVxdWF0aW9uIGNvbW1lbnRzKS4KICAgICAqLwogICAgY29uc3QgV09SS0xFVF9MT0dfUFJFRklYID0gIltjYWNvcGhvbnkvd29ya2xldDpkeW5hbWljc10iOwogICAgLyoqCiAgICAgKiBSYXRpbyBzZW50aW5lbDogdGhlIHdvcmtsZXQncyBBdWRpb1BhcmFtIGNhbm5vdCBjYXJyeSArSW5maW5pdHksIHNvIGEKICAgICAqIGxpbWl0ZXIgaXMgZXhwcmVzc2VkIGFzIGEgdmVyeSBsYXJnZSBmaW5pdGUgcmF0aW8gaGVyZSBhbmQgdHJlYXRlZCBhcwogICAgICogIi0+aW5maW5pdHkiIGJ5IHRoZSBnYWluIGNvbXB1dGVyIChzbG9wZSBlZmZlY3RpdmVseSAwIGFib3ZlIHRocmVzaG9sZCkuCiAgICAgKiBjcmVhdGVMaW1pdGVyKCkgaW4gY2Fjb3Bob255LnRzIHNldHMgdGhlIHJhdGlvIHRvIHRoaXMgdmFsdWUuCiAgICAgKi8KICAgIGNvbnN0IExJTUlURVJfUkFUSU8gPSAxMDAwOwogICAgY2xhc3MgRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHsKICAgICAgICAvLyBPbmUgc3RhdGVmdWwgY29yZSBwZXIgY2hhbm5lbCBzbyBlYWNoIGNoYW5uZWwga2VlcHMgaXRzIG93biBiYWxsaXN0aWNzCiAgICAgICAgLy8gZW52ZWxvcGUgKGVxLjE2IGRldGVjdG9yIHN0YXRlKSBhY3Jvc3MgcHJvY2VzcygpIGJsb2Nrcy4KICAgICAgICBjb3JlcyA9IFtdOwogICAgICAgIHN0YXRpYyBnZXQgcGFyYW1ldGVyRGVzY3JpcHRvcnMoKSB7CiAgICAgICAgICAgIC8vIERlZmF1bHQgVkFMVUVTIGNvbWUgZnJvbSBEWU5BTUlDU19ERUZBVUxUUyAoZHluYW1pY3MtY29yZS50cykg4oCUIHRoZSBzaW5nbGUKICAgICAgICAgICAgLy8gc291cmNlIG9mIHRydXRoIHNoYXJlZCB3aXRoIHRoZSBnYXRlIHJlZ3Jlc3Npb24gdGVzdHMuIFJhbmdlcyBsaXZlIGhlcmUKICAgICAgICAgICAgLy8gYW5kIGNvdmVyIGNvbXByZXNzb3IgKHJhdGlvID49IDEpLCBsaW1pdGVyIChyYXRpbyAtPiBsYXJnZSksIGFuZCBkb3dud2FyZAogICAgICAgICAgICAvLyBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpIGZyb20gb25lIHBhcmFtZXRlciBzZXQuCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBbInRocmVzaG9sZCIsIERZTkFNSUNTX0RFRkFVTFRTLnRocmVzaG9sZCwgLTEwMCwgMCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJyYXRpbyIsIERZTkFNSUNTX0RFRkFVTFRTLnJhdGlvLCAwLjA1LCBMSU1JVEVSX1JBVElPLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbImtuZWUiLCBEWU5BTUlDU19ERUZBVUxUUy5rbmVlLCAwLCA0MCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJhdHRhY2siLCBEWU5BTUlDU19ERUZBVUxUUy5hdHRhY2ssIDAsIDEsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmVsZWFzZSIsIERZTkFNSUNTX0RFRkFVTFRTLnJlbGVhc2UsIDAsIDUsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsibWFrZXVwIiwgRFlOQU1JQ1NfREVGQVVMVFMubWFrZXVwLCAtMjQsIDI0LCAiay1yYXRlIl0sCiAgICAgICAgICAgIF0ubWFwKChbbmFtZSwgZGVmYXVsdFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGF1dG9tYXRpb25SYXRlXSkgPT4gKHsKICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSwKICAgICAgICAgICAgICAgIG1heFZhbHVlOiBtYXhWYWx1ZSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpb25SYXRlOiBhdXRvbWF0aW9uUmF0ZSwKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBwcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycykgewogICAgICAgICAgICBjb25zdCBpbnB1dCA9IGlucHV0c1swXTsKICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTsKICAgICAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC5sZW5ndGggPT09IDAgfHwgIW91dHB1dCB8fCBvdXRwdXQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBrLXJhdGUgcGFyYW1zOiB0YWtlIHRoZSBmaXJzdCAoY29uc3RhbnQtb3Zlci1ibG9jaykgdmFsdWUuIEEgcmF0aW8gYXQgb3IKICAgICAgICAgICAgLy8gYWJvdmUgdGhlIGxpbWl0ZXIgc2VudGluZWwgaXMgbWFwcGVkIHRvICtJbmZpbml0eSBzbyB0aGUgY29yZSdzIGdhaW4KICAgICAgICAgICAgLy8gY29tcHV0ZXIgdXNlcyB0aGUgZXhhY3QgbGltaXRlciBzbG9wZSAoMCkgcmF0aGVyIHRoYW4gMS9MSU1JVEVSX1JBVElPLgogICAgICAgICAgICBjb25zdCByYXRpb1BhcmFtID0gcGFyYW1ldGVycy5yYXRpb1swXTsKICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICAgICAgdGhyZXNob2xkOiBwYXJhbWV0ZXJzLnRocmVzaG9sZFswXSwKICAgICAgICAgICAgICAgIHJhdGlvOiByYXRpb1BhcmFtID49IExJTUlURVJfUkFUSU8gPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiByYXRpb1BhcmFtLAogICAgICAgICAgICAgICAga25lZTogcGFyYW1ldGVycy5rbmVlWzBdLAogICAgICAgICAgICAgICAgYXR0YWNrOiBwYXJhbWV0ZXJzLmF0dGFja1swXSwKICAgICAgICAgICAgICAgIHJlbGVhc2U6IHBhcmFtZXRlcnMucmVsZWFzZVswXSwKICAgICAgICAgICAgICAgIG1ha2V1cDogcGFyYW1ldGVycy5tYWtldXBbMF0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgb3V0cHV0Lmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb3Jlc1tjaF0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXSA9IG5ldyBEeW5hbWljc1Byb2Nlc3NvcihzYW1wbGVSYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuY29yZXNbY2hdLnByb2Nlc3MoaW5wdXRbY2hdLCBvdXRwdXRbY2hdLCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IG1vZHVsZSBldmFsdWF0aW5nYCk7CiAgICB0cnkgewogICAgICAgIHJlZ2lzdGVyUHJvY2Vzc29yKCJkeW5hbWljcyIsIER5bmFtaWNzV29ya2xldFByb2Nlc3Nvcik7CiAgICAgICAgY29uc29sZS5pbmZvKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgY29tcGxldGVgKTsKICAgIH0KICAgIGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7V09SS0xFVF9MT0dfUFJFRklYfSByZWdpc3RlclByb2Nlc3NvciBmYWlsZWRgLCBlcnJvcik7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CgogICAgZXhwb3J0cy5EeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IgPSBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3I7CgogICAgcmV0dXJuIGV4cG9ydHM7Cgp9KSh7fSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWR5bmFtaWNzLWJ1bmRsZS5qcy5tYXAK`;exports.default=e;
1
+ var e=`data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqIFRlcm1pbmFsIHJldGlyZW1lbnQgaXMgZGlzdGluY3QgZnJvbSB0ZW1wb3JhcmlseSBsb3NpbmcgYW4gaW5wdXQgb3IgYnlwYXNzaW5nIGFuIGVmZmVjdC4gKi8KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRWZmZWN0UHJvY2Vzc29yKG5hbWUsIFByb2Nlc3NvcikgewogICAgICAgIGNsYXNzIE93bmVkRWZmZWN0UHJvY2Vzc29yIGV4dGVuZHMgUHJvY2Vzc29yIHsKICAgICAgICAgICAgZGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICAgICAgICAgICAgc3VwZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhICE9PSAiY2Fjb3Bob255OmRpc3Bvc2UiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKCJjYWNvcGhvbnk6ZGlzcG9zZWQiKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5wb3J0LnN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5kaXNwb3NlZCAmJiBzdXBlci5wcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVnaXN0ZXJQcm9jZXNzb3IobmFtZSwgT3duZWRFZmZlY3RQcm9jZXNzb3IpOwogICAgfQoKICAgIC8qCiAgICAgKiBEeW5hbWljcyBBdWRpb1dvcmtsZXQgc2hlbGwg4oCUIHRoaW4gQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHRoYXQgZGVsZWdhdGVzIEFMTAogICAgICogRFNQIG1hdGggdG8gdGhlIGNvbnRleHQtZnJlZSBEeW5hbWljc1Byb2Nlc3NvciBpbiBkeW5hbWljcy1jb3JlLnRzLiBNaXJyb3JzCiAgICAgKiB0aGUgZGF0dG9ycm8tcmV2ZXJiLnRzIC8gc3RlcmVvLXRvLWJmb3JtYXQudHMgY29yZS9zaGVsbCBzcGxpdDogdGhpcyBmaWxlCiAgICAgKiBvd25zIG9ubHkgdGhlIHdvcmtsZXQgcGx1bWJpbmcgKHBhcmFtZXRlckRlc2NyaXB0b3JzLCBwcm9jZXNzKCksIHRoZQogICAgICogcmVnaXN0ZXJQcm9jZXNzb3IgY2FsbCk7IHRoZSBhbGdvcml0aG0gbGl2ZXMgaW4gdGhlIHVuaXQtdGVzdGVkIGNvcmUuCiAgICAgKgogICAgICogQWxnb3JpdGhtOiBmZWVkLWZvcndhcmQgZHluYW1pYyByYW5nZSBjb21wcmVzc29yL2xpbWl0ZXIvZXhwYW5kZXIvZ2F0ZSBwZXIKICAgICAqIEdpYW5ub3VsaXMsIE1hc3NiZXJnICYgUmVpc3MgMjAxMiAoc2VlIGR5bmFtaWNzLWNvcmUudHMgaGVhZGVyIGZvciB0aGUgZnVsbAogICAgICogY2l0YXRpb24gYW5kIHBlci1lcXVhdGlvbiBjb21tZW50cykuCiAgICAgKi8KICAgIGNvbnN0IFdPUktMRVRfTE9HX1BSRUZJWCA9ICJbY2Fjb3Bob255L3dvcmtsZXQ6ZHluYW1pY3NdIjsKICAgIC8qKgogICAgICogUmF0aW8gc2VudGluZWw6IHRoZSB3b3JrbGV0J3MgQXVkaW9QYXJhbSBjYW5ub3QgY2FycnkgK0luZmluaXR5LCBzbyBhCiAgICAgKiBsaW1pdGVyIGlzIGV4cHJlc3NlZCBhcyBhIHZlcnkgbGFyZ2UgZmluaXRlIHJhdGlvIGhlcmUgYW5kIHRyZWF0ZWQgYXMKICAgICAqICItPmluZmluaXR5IiBieSB0aGUgZ2FpbiBjb21wdXRlciAoc2xvcGUgZWZmZWN0aXZlbHkgMCBhYm92ZSB0aHJlc2hvbGQpLgogICAgICogY3JlYXRlTGltaXRlcigpIGluIGNhY29waG9ueS50cyBzZXRzIHRoZSByYXRpbyB0byB0aGlzIHZhbHVlLgogICAgICovCiAgICBjb25zdCBMSU1JVEVSX1JBVElPID0gMTAwMDsKICAgIGNsYXNzIER5bmFtaWNzV29ya2xldFByb2Nlc3NvciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvciB7CiAgICAgICAgLy8gT25lIHN0YXRlZnVsIGNvcmUgcGVyIGNoYW5uZWwgc28gZWFjaCBjaGFubmVsIGtlZXBzIGl0cyBvd24gYmFsbGlzdGljcwogICAgICAgIC8vIGVudmVsb3BlIChlcS4xNiBkZXRlY3RvciBzdGF0ZSkgYWNyb3NzIHByb2Nlc3MoKSBibG9ja3MuCiAgICAgICAgY29yZXMgPSBbXTsKICAgICAgICBzdGF0aWMgZ2V0IHBhcmFtZXRlckRlc2NyaXB0b3JzKCkgewogICAgICAgICAgICAvLyBEZWZhdWx0IFZBTFVFUyBjb21lIGZyb20gRFlOQU1JQ1NfREVGQVVMVFMgKGR5bmFtaWNzLWNvcmUudHMpIOKAlCB0aGUgc2luZ2xlCiAgICAgICAgICAgIC8vIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgd2l0aCB0aGUgZ2F0ZSByZWdyZXNzaW9uIHRlc3RzLiBSYW5nZXMgbGl2ZSBoZXJlCiAgICAgICAgICAgIC8vIGFuZCBjb3ZlciBjb21wcmVzc29yIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpLCBhbmQgZG93bndhcmQKICAgICAgICAgICAgLy8gZXhwYW5kZXIvZ2F0ZSAocmF0aW8gPCAxKSBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgWyJ0aHJlc2hvbGQiLCBEWU5BTUlDU19ERUZBVUxUUy50aHJlc2hvbGQsIC0xMDAsIDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmF0aW8iLCBEWU5BTUlDU19ERUZBVUxUUy5yYXRpbywgMC4wNSwgTElNSVRFUl9SQVRJTywgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJrbmVlIiwgRFlOQU1JQ1NfREVGQVVMVFMua25lZSwgMCwgNDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsiYXR0YWNrIiwgRFlOQU1JQ1NfREVGQVVMVFMuYXR0YWNrLCAwLCAxLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbInJlbGVhc2UiLCBEWU5BTUlDU19ERUZBVUxUUy5yZWxlYXNlLCAwLCA1LCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbIm1ha2V1cCIsIERZTkFNSUNTX0RFRkFVTFRTLm1ha2V1cCwgLTI0LCAyNCwgImstcmF0ZSJdLAogICAgICAgICAgICBdLm1hcCgoW25hbWUsIGRlZmF1bHRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBhdXRvbWF0aW9uUmF0ZV0pID0+ICh7CiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsCiAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbWluVmFsdWUsCiAgICAgICAgICAgICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsCiAgICAgICAgICAgICAgICBhdXRvbWF0aW9uUmF0ZTogYXV0b21hdGlvblJhdGUsCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbMF07CiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF07CiAgICAgICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQubGVuZ3RoID09PSAwIHx8ICFvdXRwdXQgfHwgb3V0cHV0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gay1yYXRlIHBhcmFtczogdGFrZSB0aGUgZmlyc3QgKGNvbnN0YW50LW92ZXItYmxvY2spIHZhbHVlLiBBIHJhdGlvIGF0IG9yCiAgICAgICAgICAgIC8vIGFib3ZlIHRoZSBsaW1pdGVyIHNlbnRpbmVsIGlzIG1hcHBlZCB0byArSW5maW5pdHkgc28gdGhlIGNvcmUncyBnYWluCiAgICAgICAgICAgIC8vIGNvbXB1dGVyIHVzZXMgdGhlIGV4YWN0IGxpbWl0ZXIgc2xvcGUgKDApIHJhdGhlciB0aGFuIDEvTElNSVRFUl9SQVRJTy4KICAgICAgICAgICAgY29uc3QgcmF0aW9QYXJhbSA9IHBhcmFtZXRlcnMucmF0aW9bMF07CiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICAgICAgICAgIHRocmVzaG9sZDogcGFyYW1ldGVycy50aHJlc2hvbGRbMF0sCiAgICAgICAgICAgICAgICByYXRpbzogcmF0aW9QYXJhbSA+PSBMSU1JVEVSX1JBVElPID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogcmF0aW9QYXJhbSwKICAgICAgICAgICAgICAgIGtuZWU6IHBhcmFtZXRlcnMua25lZVswXSwKICAgICAgICAgICAgICAgIGF0dGFjazogcGFyYW1ldGVycy5hdHRhY2tbMF0sCiAgICAgICAgICAgICAgICByZWxlYXNlOiBwYXJhbWV0ZXJzLnJlbGVhc2VbMF0sCiAgICAgICAgICAgICAgICBtYWtldXA6IHBhcmFtZXRlcnMubWFrZXVwWzBdLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBjaGFubmVsQ291bnQgPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIG91dHB1dC5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29yZXNbY2hdKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3Jlc1tjaF0gPSBuZXcgRHluYW1pY3NQcm9jZXNzb3Ioc2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXS5wcm9jZXNzKGlucHV0W2NoXSwgb3V0cHV0W2NoXSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBjb25zb2xlLmluZm8oYCR7V09SS0xFVF9MT0dfUFJFRklYfSBtb2R1bGUgZXZhbHVhdGluZ2ApOwogICAgdHJ5IHsKICAgICAgICByZWdpc3RlckVmZmVjdFByb2Nlc3NvcigiZHluYW1pY3MiLCBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IpOwogICAgICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IHJlZ2lzdGVyUHJvY2Vzc29yIGNvbXBsZXRlYCk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgZmFpbGVkYCwgZXJyb3IpOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQoKICAgIGV4cG9ydHMuRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yID0gRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yOwoKICAgIHJldHVybiBleHBvcnRzOwoKfSkoe30pOwovLyMgc291cmNlTWFwcGluZ1VSTD1keW5hbWljcy1idW5kbGUuanMubWFwCg==`;exports.default=e;
2
2
  //# sourceMappingURL=dynamics-bundle.js_url.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dynamics-bundle.js_url.cjs","names":[],"sources":["../../src/bundles/dynamics-bundle.js?url"],"sourcesContent":["export default \"data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIER5bmFtaWNzIEF1ZGlvV29ya2xldCBzaGVsbCDigJQgdGhpbiBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgdGhhdCBkZWxlZ2F0ZXMgQUxMCiAgICAgKiBEU1AgbWF0aCB0byB0aGUgY29udGV4dC1mcmVlIER5bmFtaWNzUHJvY2Vzc29yIGluIGR5bmFtaWNzLWNvcmUudHMuIE1pcnJvcnMKICAgICAqIHRoZSBkYXR0b3Jyby1yZXZlcmIudHMgLyBzdGVyZW8tdG8tYmZvcm1hdC50cyBjb3JlL3NoZWxsIHNwbGl0OiB0aGlzIGZpbGUKICAgICAqIG93bnMgb25seSB0aGUgd29ya2xldCBwbHVtYmluZyAocGFyYW1ldGVyRGVzY3JpcHRvcnMsIHByb2Nlc3MoKSwgdGhlCiAgICAgKiByZWdpc3RlclByb2Nlc3NvciBjYWxsKTsgdGhlIGFsZ29yaXRobSBsaXZlcyBpbiB0aGUgdW5pdC10ZXN0ZWQgY29yZS4KICAgICAqCiAgICAgKiBBbGdvcml0aG06IGZlZWQtZm9yd2FyZCBkeW5hbWljIHJhbmdlIGNvbXByZXNzb3IvbGltaXRlci9leHBhbmRlci9nYXRlIHBlcgogICAgICogR2lhbm5vdWxpcywgTWFzc2JlcmcgJiBSZWlzcyAyMDEyIChzZWUgZHluYW1pY3MtY29yZS50cyBoZWFkZXIgZm9yIHRoZSBmdWxsCiAgICAgKiBjaXRhdGlvbiBhbmQgcGVyLWVxdWF0aW9uIGNvbW1lbnRzKS4KICAgICAqLwogICAgY29uc3QgV09SS0xFVF9MT0dfUFJFRklYID0gIltjYWNvcGhvbnkvd29ya2xldDpkeW5hbWljc10iOwogICAgLyoqCiAgICAgKiBSYXRpbyBzZW50aW5lbDogdGhlIHdvcmtsZXQncyBBdWRpb1BhcmFtIGNhbm5vdCBjYXJyeSArSW5maW5pdHksIHNvIGEKICAgICAqIGxpbWl0ZXIgaXMgZXhwcmVzc2VkIGFzIGEgdmVyeSBsYXJnZSBmaW5pdGUgcmF0aW8gaGVyZSBhbmQgdHJlYXRlZCBhcwogICAgICogIi0+aW5maW5pdHkiIGJ5IHRoZSBnYWluIGNvbXB1dGVyIChzbG9wZSBlZmZlY3RpdmVseSAwIGFib3ZlIHRocmVzaG9sZCkuCiAgICAgKiBjcmVhdGVMaW1pdGVyKCkgaW4gY2Fjb3Bob255LnRzIHNldHMgdGhlIHJhdGlvIHRvIHRoaXMgdmFsdWUuCiAgICAgKi8KICAgIGNvbnN0IExJTUlURVJfUkFUSU8gPSAxMDAwOwogICAgY2xhc3MgRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHsKICAgICAgICAvLyBPbmUgc3RhdGVmdWwgY29yZSBwZXIgY2hhbm5lbCBzbyBlYWNoIGNoYW5uZWwga2VlcHMgaXRzIG93biBiYWxsaXN0aWNzCiAgICAgICAgLy8gZW52ZWxvcGUgKGVxLjE2IGRldGVjdG9yIHN0YXRlKSBhY3Jvc3MgcHJvY2VzcygpIGJsb2Nrcy4KICAgICAgICBjb3JlcyA9IFtdOwogICAgICAgIHN0YXRpYyBnZXQgcGFyYW1ldGVyRGVzY3JpcHRvcnMoKSB7CiAgICAgICAgICAgIC8vIERlZmF1bHQgVkFMVUVTIGNvbWUgZnJvbSBEWU5BTUlDU19ERUZBVUxUUyAoZHluYW1pY3MtY29yZS50cykg4oCUIHRoZSBzaW5nbGUKICAgICAgICAgICAgLy8gc291cmNlIG9mIHRydXRoIHNoYXJlZCB3aXRoIHRoZSBnYXRlIHJlZ3Jlc3Npb24gdGVzdHMuIFJhbmdlcyBsaXZlIGhlcmUKICAgICAgICAgICAgLy8gYW5kIGNvdmVyIGNvbXByZXNzb3IgKHJhdGlvID49IDEpLCBsaW1pdGVyIChyYXRpbyAtPiBsYXJnZSksIGFuZCBkb3dud2FyZAogICAgICAgICAgICAvLyBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpIGZyb20gb25lIHBhcmFtZXRlciBzZXQuCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBbInRocmVzaG9sZCIsIERZTkFNSUNTX0RFRkFVTFRTLnRocmVzaG9sZCwgLTEwMCwgMCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJyYXRpbyIsIERZTkFNSUNTX0RFRkFVTFRTLnJhdGlvLCAwLjA1LCBMSU1JVEVSX1JBVElPLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbImtuZWUiLCBEWU5BTUlDU19ERUZBVUxUUy5rbmVlLCAwLCA0MCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJhdHRhY2siLCBEWU5BTUlDU19ERUZBVUxUUy5hdHRhY2ssIDAsIDEsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmVsZWFzZSIsIERZTkFNSUNTX0RFRkFVTFRTLnJlbGVhc2UsIDAsIDUsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsibWFrZXVwIiwgRFlOQU1JQ1NfREVGQVVMVFMubWFrZXVwLCAtMjQsIDI0LCAiay1yYXRlIl0sCiAgICAgICAgICAgIF0ubWFwKChbbmFtZSwgZGVmYXVsdFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGF1dG9tYXRpb25SYXRlXSkgPT4gKHsKICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSwKICAgICAgICAgICAgICAgIG1heFZhbHVlOiBtYXhWYWx1ZSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpb25SYXRlOiBhdXRvbWF0aW9uUmF0ZSwKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBwcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycykgewogICAgICAgICAgICBjb25zdCBpbnB1dCA9IGlucHV0c1swXTsKICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTsKICAgICAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC5sZW5ndGggPT09IDAgfHwgIW91dHB1dCB8fCBvdXRwdXQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBrLXJhdGUgcGFyYW1zOiB0YWtlIHRoZSBmaXJzdCAoY29uc3RhbnQtb3Zlci1ibG9jaykgdmFsdWUuIEEgcmF0aW8gYXQgb3IKICAgICAgICAgICAgLy8gYWJvdmUgdGhlIGxpbWl0ZXIgc2VudGluZWwgaXMgbWFwcGVkIHRvICtJbmZpbml0eSBzbyB0aGUgY29yZSdzIGdhaW4KICAgICAgICAgICAgLy8gY29tcHV0ZXIgdXNlcyB0aGUgZXhhY3QgbGltaXRlciBzbG9wZSAoMCkgcmF0aGVyIHRoYW4gMS9MSU1JVEVSX1JBVElPLgogICAgICAgICAgICBjb25zdCByYXRpb1BhcmFtID0gcGFyYW1ldGVycy5yYXRpb1swXTsKICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICAgICAgdGhyZXNob2xkOiBwYXJhbWV0ZXJzLnRocmVzaG9sZFswXSwKICAgICAgICAgICAgICAgIHJhdGlvOiByYXRpb1BhcmFtID49IExJTUlURVJfUkFUSU8gPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiByYXRpb1BhcmFtLAogICAgICAgICAgICAgICAga25lZTogcGFyYW1ldGVycy5rbmVlWzBdLAogICAgICAgICAgICAgICAgYXR0YWNrOiBwYXJhbWV0ZXJzLmF0dGFja1swXSwKICAgICAgICAgICAgICAgIHJlbGVhc2U6IHBhcmFtZXRlcnMucmVsZWFzZVswXSwKICAgICAgICAgICAgICAgIG1ha2V1cDogcGFyYW1ldGVycy5tYWtldXBbMF0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgb3V0cHV0Lmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb3Jlc1tjaF0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXSA9IG5ldyBEeW5hbWljc1Byb2Nlc3NvcihzYW1wbGVSYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuY29yZXNbY2hdLnByb2Nlc3MoaW5wdXRbY2hdLCBvdXRwdXRbY2hdLCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IG1vZHVsZSBldmFsdWF0aW5nYCk7CiAgICB0cnkgewogICAgICAgIHJlZ2lzdGVyUHJvY2Vzc29yKCJkeW5hbWljcyIsIER5bmFtaWNzV29ya2xldFByb2Nlc3Nvcik7CiAgICAgICAgY29uc29sZS5pbmZvKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgY29tcGxldGVgKTsKICAgIH0KICAgIGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7V09SS0xFVF9MT0dfUFJFRklYfSByZWdpc3RlclByb2Nlc3NvciBmYWlsZWRgLCBlcnJvcik7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CgogICAgZXhwb3J0cy5EeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IgPSBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3I7CgogICAgcmV0dXJuIGV4cG9ydHM7Cgp9KSh7fSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWR5bmFtaWNzLWJ1bmRsZS5qcy5tYXAK\""],"mappings":"AAAA,IAAA,EAAe"}
1
+ {"version":3,"file":"dynamics-bundle.js_url.cjs","names":[],"sources":["../../src/bundles/dynamics-bundle.js?url"],"sourcesContent":["export default \"data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqIFRlcm1pbmFsIHJldGlyZW1lbnQgaXMgZGlzdGluY3QgZnJvbSB0ZW1wb3JhcmlseSBsb3NpbmcgYW4gaW5wdXQgb3IgYnlwYXNzaW5nIGFuIGVmZmVjdC4gKi8KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRWZmZWN0UHJvY2Vzc29yKG5hbWUsIFByb2Nlc3NvcikgewogICAgICAgIGNsYXNzIE93bmVkRWZmZWN0UHJvY2Vzc29yIGV4dGVuZHMgUHJvY2Vzc29yIHsKICAgICAgICAgICAgZGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICAgICAgICAgICAgc3VwZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhICE9PSAiY2Fjb3Bob255OmRpc3Bvc2UiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKCJjYWNvcGhvbnk6ZGlzcG9zZWQiKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5wb3J0LnN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5kaXNwb3NlZCAmJiBzdXBlci5wcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVnaXN0ZXJQcm9jZXNzb3IobmFtZSwgT3duZWRFZmZlY3RQcm9jZXNzb3IpOwogICAgfQoKICAgIC8qCiAgICAgKiBEeW5hbWljcyBBdWRpb1dvcmtsZXQgc2hlbGwg4oCUIHRoaW4gQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHRoYXQgZGVsZWdhdGVzIEFMTAogICAgICogRFNQIG1hdGggdG8gdGhlIGNvbnRleHQtZnJlZSBEeW5hbWljc1Byb2Nlc3NvciBpbiBkeW5hbWljcy1jb3JlLnRzLiBNaXJyb3JzCiAgICAgKiB0aGUgZGF0dG9ycm8tcmV2ZXJiLnRzIC8gc3RlcmVvLXRvLWJmb3JtYXQudHMgY29yZS9zaGVsbCBzcGxpdDogdGhpcyBmaWxlCiAgICAgKiBvd25zIG9ubHkgdGhlIHdvcmtsZXQgcGx1bWJpbmcgKHBhcmFtZXRlckRlc2NyaXB0b3JzLCBwcm9jZXNzKCksIHRoZQogICAgICogcmVnaXN0ZXJQcm9jZXNzb3IgY2FsbCk7IHRoZSBhbGdvcml0aG0gbGl2ZXMgaW4gdGhlIHVuaXQtdGVzdGVkIGNvcmUuCiAgICAgKgogICAgICogQWxnb3JpdGhtOiBmZWVkLWZvcndhcmQgZHluYW1pYyByYW5nZSBjb21wcmVzc29yL2xpbWl0ZXIvZXhwYW5kZXIvZ2F0ZSBwZXIKICAgICAqIEdpYW5ub3VsaXMsIE1hc3NiZXJnICYgUmVpc3MgMjAxMiAoc2VlIGR5bmFtaWNzLWNvcmUudHMgaGVhZGVyIGZvciB0aGUgZnVsbAogICAgICogY2l0YXRpb24gYW5kIHBlci1lcXVhdGlvbiBjb21tZW50cykuCiAgICAgKi8KICAgIGNvbnN0IFdPUktMRVRfTE9HX1BSRUZJWCA9ICJbY2Fjb3Bob255L3dvcmtsZXQ6ZHluYW1pY3NdIjsKICAgIC8qKgogICAgICogUmF0aW8gc2VudGluZWw6IHRoZSB3b3JrbGV0J3MgQXVkaW9QYXJhbSBjYW5ub3QgY2FycnkgK0luZmluaXR5LCBzbyBhCiAgICAgKiBsaW1pdGVyIGlzIGV4cHJlc3NlZCBhcyBhIHZlcnkgbGFyZ2UgZmluaXRlIHJhdGlvIGhlcmUgYW5kIHRyZWF0ZWQgYXMKICAgICAqICItPmluZmluaXR5IiBieSB0aGUgZ2FpbiBjb21wdXRlciAoc2xvcGUgZWZmZWN0aXZlbHkgMCBhYm92ZSB0aHJlc2hvbGQpLgogICAgICogY3JlYXRlTGltaXRlcigpIGluIGNhY29waG9ueS50cyBzZXRzIHRoZSByYXRpbyB0byB0aGlzIHZhbHVlLgogICAgICovCiAgICBjb25zdCBMSU1JVEVSX1JBVElPID0gMTAwMDsKICAgIGNsYXNzIER5bmFtaWNzV29ya2xldFByb2Nlc3NvciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvciB7CiAgICAgICAgLy8gT25lIHN0YXRlZnVsIGNvcmUgcGVyIGNoYW5uZWwgc28gZWFjaCBjaGFubmVsIGtlZXBzIGl0cyBvd24gYmFsbGlzdGljcwogICAgICAgIC8vIGVudmVsb3BlIChlcS4xNiBkZXRlY3RvciBzdGF0ZSkgYWNyb3NzIHByb2Nlc3MoKSBibG9ja3MuCiAgICAgICAgY29yZXMgPSBbXTsKICAgICAgICBzdGF0aWMgZ2V0IHBhcmFtZXRlckRlc2NyaXB0b3JzKCkgewogICAgICAgICAgICAvLyBEZWZhdWx0IFZBTFVFUyBjb21lIGZyb20gRFlOQU1JQ1NfREVGQVVMVFMgKGR5bmFtaWNzLWNvcmUudHMpIOKAlCB0aGUgc2luZ2xlCiAgICAgICAgICAgIC8vIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgd2l0aCB0aGUgZ2F0ZSByZWdyZXNzaW9uIHRlc3RzLiBSYW5nZXMgbGl2ZSBoZXJlCiAgICAgICAgICAgIC8vIGFuZCBjb3ZlciBjb21wcmVzc29yIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpLCBhbmQgZG93bndhcmQKICAgICAgICAgICAgLy8gZXhwYW5kZXIvZ2F0ZSAocmF0aW8gPCAxKSBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgWyJ0aHJlc2hvbGQiLCBEWU5BTUlDU19ERUZBVUxUUy50aHJlc2hvbGQsIC0xMDAsIDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmF0aW8iLCBEWU5BTUlDU19ERUZBVUxUUy5yYXRpbywgMC4wNSwgTElNSVRFUl9SQVRJTywgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJrbmVlIiwgRFlOQU1JQ1NfREVGQVVMVFMua25lZSwgMCwgNDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsiYXR0YWNrIiwgRFlOQU1JQ1NfREVGQVVMVFMuYXR0YWNrLCAwLCAxLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbInJlbGVhc2UiLCBEWU5BTUlDU19ERUZBVUxUUy5yZWxlYXNlLCAwLCA1LCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbIm1ha2V1cCIsIERZTkFNSUNTX0RFRkFVTFRTLm1ha2V1cCwgLTI0LCAyNCwgImstcmF0ZSJdLAogICAgICAgICAgICBdLm1hcCgoW25hbWUsIGRlZmF1bHRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBhdXRvbWF0aW9uUmF0ZV0pID0+ICh7CiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsCiAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbWluVmFsdWUsCiAgICAgICAgICAgICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsCiAgICAgICAgICAgICAgICBhdXRvbWF0aW9uUmF0ZTogYXV0b21hdGlvblJhdGUsCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbMF07CiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF07CiAgICAgICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQubGVuZ3RoID09PSAwIHx8ICFvdXRwdXQgfHwgb3V0cHV0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gay1yYXRlIHBhcmFtczogdGFrZSB0aGUgZmlyc3QgKGNvbnN0YW50LW92ZXItYmxvY2spIHZhbHVlLiBBIHJhdGlvIGF0IG9yCiAgICAgICAgICAgIC8vIGFib3ZlIHRoZSBsaW1pdGVyIHNlbnRpbmVsIGlzIG1hcHBlZCB0byArSW5maW5pdHkgc28gdGhlIGNvcmUncyBnYWluCiAgICAgICAgICAgIC8vIGNvbXB1dGVyIHVzZXMgdGhlIGV4YWN0IGxpbWl0ZXIgc2xvcGUgKDApIHJhdGhlciB0aGFuIDEvTElNSVRFUl9SQVRJTy4KICAgICAgICAgICAgY29uc3QgcmF0aW9QYXJhbSA9IHBhcmFtZXRlcnMucmF0aW9bMF07CiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICAgICAgICAgIHRocmVzaG9sZDogcGFyYW1ldGVycy50aHJlc2hvbGRbMF0sCiAgICAgICAgICAgICAgICByYXRpbzogcmF0aW9QYXJhbSA+PSBMSU1JVEVSX1JBVElPID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogcmF0aW9QYXJhbSwKICAgICAgICAgICAgICAgIGtuZWU6IHBhcmFtZXRlcnMua25lZVswXSwKICAgICAgICAgICAgICAgIGF0dGFjazogcGFyYW1ldGVycy5hdHRhY2tbMF0sCiAgICAgICAgICAgICAgICByZWxlYXNlOiBwYXJhbWV0ZXJzLnJlbGVhc2VbMF0sCiAgICAgICAgICAgICAgICBtYWtldXA6IHBhcmFtZXRlcnMubWFrZXVwWzBdLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBjaGFubmVsQ291bnQgPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIG91dHB1dC5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29yZXNbY2hdKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3Jlc1tjaF0gPSBuZXcgRHluYW1pY3NQcm9jZXNzb3Ioc2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXS5wcm9jZXNzKGlucHV0W2NoXSwgb3V0cHV0W2NoXSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBjb25zb2xlLmluZm8oYCR7V09SS0xFVF9MT0dfUFJFRklYfSBtb2R1bGUgZXZhbHVhdGluZ2ApOwogICAgdHJ5IHsKICAgICAgICByZWdpc3RlckVmZmVjdFByb2Nlc3NvcigiZHluYW1pY3MiLCBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IpOwogICAgICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IHJlZ2lzdGVyUHJvY2Vzc29yIGNvbXBsZXRlYCk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgZmFpbGVkYCwgZXJyb3IpOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQoKICAgIGV4cG9ydHMuRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yID0gRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yOwoKICAgIHJldHVybiBleHBvcnRzOwoKfSkoe30pOwovLyMgc291cmNlTWFwcGluZ1VSTD1keW5hbWljcy1idW5kbGUuanMubWFwCg==\""],"mappings":"AAAA,IAAA,EAAe"}
@@ -1,5 +1,5 @@
1
1
  //#region src/bundles/dynamics-bundle.js?url
2
- var e = "data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIER5bmFtaWNzIEF1ZGlvV29ya2xldCBzaGVsbCDigJQgdGhpbiBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgdGhhdCBkZWxlZ2F0ZXMgQUxMCiAgICAgKiBEU1AgbWF0aCB0byB0aGUgY29udGV4dC1mcmVlIER5bmFtaWNzUHJvY2Vzc29yIGluIGR5bmFtaWNzLWNvcmUudHMuIE1pcnJvcnMKICAgICAqIHRoZSBkYXR0b3Jyby1yZXZlcmIudHMgLyBzdGVyZW8tdG8tYmZvcm1hdC50cyBjb3JlL3NoZWxsIHNwbGl0OiB0aGlzIGZpbGUKICAgICAqIG93bnMgb25seSB0aGUgd29ya2xldCBwbHVtYmluZyAocGFyYW1ldGVyRGVzY3JpcHRvcnMsIHByb2Nlc3MoKSwgdGhlCiAgICAgKiByZWdpc3RlclByb2Nlc3NvciBjYWxsKTsgdGhlIGFsZ29yaXRobSBsaXZlcyBpbiB0aGUgdW5pdC10ZXN0ZWQgY29yZS4KICAgICAqCiAgICAgKiBBbGdvcml0aG06IGZlZWQtZm9yd2FyZCBkeW5hbWljIHJhbmdlIGNvbXByZXNzb3IvbGltaXRlci9leHBhbmRlci9nYXRlIHBlcgogICAgICogR2lhbm5vdWxpcywgTWFzc2JlcmcgJiBSZWlzcyAyMDEyIChzZWUgZHluYW1pY3MtY29yZS50cyBoZWFkZXIgZm9yIHRoZSBmdWxsCiAgICAgKiBjaXRhdGlvbiBhbmQgcGVyLWVxdWF0aW9uIGNvbW1lbnRzKS4KICAgICAqLwogICAgY29uc3QgV09SS0xFVF9MT0dfUFJFRklYID0gIltjYWNvcGhvbnkvd29ya2xldDpkeW5hbWljc10iOwogICAgLyoqCiAgICAgKiBSYXRpbyBzZW50aW5lbDogdGhlIHdvcmtsZXQncyBBdWRpb1BhcmFtIGNhbm5vdCBjYXJyeSArSW5maW5pdHksIHNvIGEKICAgICAqIGxpbWl0ZXIgaXMgZXhwcmVzc2VkIGFzIGEgdmVyeSBsYXJnZSBmaW5pdGUgcmF0aW8gaGVyZSBhbmQgdHJlYXRlZCBhcwogICAgICogIi0+aW5maW5pdHkiIGJ5IHRoZSBnYWluIGNvbXB1dGVyIChzbG9wZSBlZmZlY3RpdmVseSAwIGFib3ZlIHRocmVzaG9sZCkuCiAgICAgKiBjcmVhdGVMaW1pdGVyKCkgaW4gY2Fjb3Bob255LnRzIHNldHMgdGhlIHJhdGlvIHRvIHRoaXMgdmFsdWUuCiAgICAgKi8KICAgIGNvbnN0IExJTUlURVJfUkFUSU8gPSAxMDAwOwogICAgY2xhc3MgRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHsKICAgICAgICAvLyBPbmUgc3RhdGVmdWwgY29yZSBwZXIgY2hhbm5lbCBzbyBlYWNoIGNoYW5uZWwga2VlcHMgaXRzIG93biBiYWxsaXN0aWNzCiAgICAgICAgLy8gZW52ZWxvcGUgKGVxLjE2IGRldGVjdG9yIHN0YXRlKSBhY3Jvc3MgcHJvY2VzcygpIGJsb2Nrcy4KICAgICAgICBjb3JlcyA9IFtdOwogICAgICAgIHN0YXRpYyBnZXQgcGFyYW1ldGVyRGVzY3JpcHRvcnMoKSB7CiAgICAgICAgICAgIC8vIERlZmF1bHQgVkFMVUVTIGNvbWUgZnJvbSBEWU5BTUlDU19ERUZBVUxUUyAoZHluYW1pY3MtY29yZS50cykg4oCUIHRoZSBzaW5nbGUKICAgICAgICAgICAgLy8gc291cmNlIG9mIHRydXRoIHNoYXJlZCB3aXRoIHRoZSBnYXRlIHJlZ3Jlc3Npb24gdGVzdHMuIFJhbmdlcyBsaXZlIGhlcmUKICAgICAgICAgICAgLy8gYW5kIGNvdmVyIGNvbXByZXNzb3IgKHJhdGlvID49IDEpLCBsaW1pdGVyIChyYXRpbyAtPiBsYXJnZSksIGFuZCBkb3dud2FyZAogICAgICAgICAgICAvLyBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpIGZyb20gb25lIHBhcmFtZXRlciBzZXQuCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBbInRocmVzaG9sZCIsIERZTkFNSUNTX0RFRkFVTFRTLnRocmVzaG9sZCwgLTEwMCwgMCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJyYXRpbyIsIERZTkFNSUNTX0RFRkFVTFRTLnJhdGlvLCAwLjA1LCBMSU1JVEVSX1JBVElPLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbImtuZWUiLCBEWU5BTUlDU19ERUZBVUxUUy5rbmVlLCAwLCA0MCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJhdHRhY2siLCBEWU5BTUlDU19ERUZBVUxUUy5hdHRhY2ssIDAsIDEsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmVsZWFzZSIsIERZTkFNSUNTX0RFRkFVTFRTLnJlbGVhc2UsIDAsIDUsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsibWFrZXVwIiwgRFlOQU1JQ1NfREVGQVVMVFMubWFrZXVwLCAtMjQsIDI0LCAiay1yYXRlIl0sCiAgICAgICAgICAgIF0ubWFwKChbbmFtZSwgZGVmYXVsdFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGF1dG9tYXRpb25SYXRlXSkgPT4gKHsKICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSwKICAgICAgICAgICAgICAgIG1heFZhbHVlOiBtYXhWYWx1ZSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpb25SYXRlOiBhdXRvbWF0aW9uUmF0ZSwKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBwcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycykgewogICAgICAgICAgICBjb25zdCBpbnB1dCA9IGlucHV0c1swXTsKICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTsKICAgICAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC5sZW5ndGggPT09IDAgfHwgIW91dHB1dCB8fCBvdXRwdXQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBrLXJhdGUgcGFyYW1zOiB0YWtlIHRoZSBmaXJzdCAoY29uc3RhbnQtb3Zlci1ibG9jaykgdmFsdWUuIEEgcmF0aW8gYXQgb3IKICAgICAgICAgICAgLy8gYWJvdmUgdGhlIGxpbWl0ZXIgc2VudGluZWwgaXMgbWFwcGVkIHRvICtJbmZpbml0eSBzbyB0aGUgY29yZSdzIGdhaW4KICAgICAgICAgICAgLy8gY29tcHV0ZXIgdXNlcyB0aGUgZXhhY3QgbGltaXRlciBzbG9wZSAoMCkgcmF0aGVyIHRoYW4gMS9MSU1JVEVSX1JBVElPLgogICAgICAgICAgICBjb25zdCByYXRpb1BhcmFtID0gcGFyYW1ldGVycy5yYXRpb1swXTsKICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICAgICAgdGhyZXNob2xkOiBwYXJhbWV0ZXJzLnRocmVzaG9sZFswXSwKICAgICAgICAgICAgICAgIHJhdGlvOiByYXRpb1BhcmFtID49IExJTUlURVJfUkFUSU8gPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiByYXRpb1BhcmFtLAogICAgICAgICAgICAgICAga25lZTogcGFyYW1ldGVycy5rbmVlWzBdLAogICAgICAgICAgICAgICAgYXR0YWNrOiBwYXJhbWV0ZXJzLmF0dGFja1swXSwKICAgICAgICAgICAgICAgIHJlbGVhc2U6IHBhcmFtZXRlcnMucmVsZWFzZVswXSwKICAgICAgICAgICAgICAgIG1ha2V1cDogcGFyYW1ldGVycy5tYWtldXBbMF0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgb3V0cHV0Lmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb3Jlc1tjaF0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXSA9IG5ldyBEeW5hbWljc1Byb2Nlc3NvcihzYW1wbGVSYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuY29yZXNbY2hdLnByb2Nlc3MoaW5wdXRbY2hdLCBvdXRwdXRbY2hdLCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IG1vZHVsZSBldmFsdWF0aW5nYCk7CiAgICB0cnkgewogICAgICAgIHJlZ2lzdGVyUHJvY2Vzc29yKCJkeW5hbWljcyIsIER5bmFtaWNzV29ya2xldFByb2Nlc3Nvcik7CiAgICAgICAgY29uc29sZS5pbmZvKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgY29tcGxldGVgKTsKICAgIH0KICAgIGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7V09SS0xFVF9MT0dfUFJFRklYfSByZWdpc3RlclByb2Nlc3NvciBmYWlsZWRgLCBlcnJvcik7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CgogICAgZXhwb3J0cy5EeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IgPSBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3I7CgogICAgcmV0dXJuIGV4cG9ydHM7Cgp9KSh7fSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWR5bmFtaWNzLWJ1bmRsZS5qcy5tYXAK";
2
+ var e = "data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqIFRlcm1pbmFsIHJldGlyZW1lbnQgaXMgZGlzdGluY3QgZnJvbSB0ZW1wb3JhcmlseSBsb3NpbmcgYW4gaW5wdXQgb3IgYnlwYXNzaW5nIGFuIGVmZmVjdC4gKi8KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRWZmZWN0UHJvY2Vzc29yKG5hbWUsIFByb2Nlc3NvcikgewogICAgICAgIGNsYXNzIE93bmVkRWZmZWN0UHJvY2Vzc29yIGV4dGVuZHMgUHJvY2Vzc29yIHsKICAgICAgICAgICAgZGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICAgICAgICAgICAgc3VwZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhICE9PSAiY2Fjb3Bob255OmRpc3Bvc2UiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKCJjYWNvcGhvbnk6ZGlzcG9zZWQiKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5wb3J0LnN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5kaXNwb3NlZCAmJiBzdXBlci5wcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVnaXN0ZXJQcm9jZXNzb3IobmFtZSwgT3duZWRFZmZlY3RQcm9jZXNzb3IpOwogICAgfQoKICAgIC8qCiAgICAgKiBEeW5hbWljcyBBdWRpb1dvcmtsZXQgc2hlbGwg4oCUIHRoaW4gQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHRoYXQgZGVsZWdhdGVzIEFMTAogICAgICogRFNQIG1hdGggdG8gdGhlIGNvbnRleHQtZnJlZSBEeW5hbWljc1Byb2Nlc3NvciBpbiBkeW5hbWljcy1jb3JlLnRzLiBNaXJyb3JzCiAgICAgKiB0aGUgZGF0dG9ycm8tcmV2ZXJiLnRzIC8gc3RlcmVvLXRvLWJmb3JtYXQudHMgY29yZS9zaGVsbCBzcGxpdDogdGhpcyBmaWxlCiAgICAgKiBvd25zIG9ubHkgdGhlIHdvcmtsZXQgcGx1bWJpbmcgKHBhcmFtZXRlckRlc2NyaXB0b3JzLCBwcm9jZXNzKCksIHRoZQogICAgICogcmVnaXN0ZXJQcm9jZXNzb3IgY2FsbCk7IHRoZSBhbGdvcml0aG0gbGl2ZXMgaW4gdGhlIHVuaXQtdGVzdGVkIGNvcmUuCiAgICAgKgogICAgICogQWxnb3JpdGhtOiBmZWVkLWZvcndhcmQgZHluYW1pYyByYW5nZSBjb21wcmVzc29yL2xpbWl0ZXIvZXhwYW5kZXIvZ2F0ZSBwZXIKICAgICAqIEdpYW5ub3VsaXMsIE1hc3NiZXJnICYgUmVpc3MgMjAxMiAoc2VlIGR5bmFtaWNzLWNvcmUudHMgaGVhZGVyIGZvciB0aGUgZnVsbAogICAgICogY2l0YXRpb24gYW5kIHBlci1lcXVhdGlvbiBjb21tZW50cykuCiAgICAgKi8KICAgIGNvbnN0IFdPUktMRVRfTE9HX1BSRUZJWCA9ICJbY2Fjb3Bob255L3dvcmtsZXQ6ZHluYW1pY3NdIjsKICAgIC8qKgogICAgICogUmF0aW8gc2VudGluZWw6IHRoZSB3b3JrbGV0J3MgQXVkaW9QYXJhbSBjYW5ub3QgY2FycnkgK0luZmluaXR5LCBzbyBhCiAgICAgKiBsaW1pdGVyIGlzIGV4cHJlc3NlZCBhcyBhIHZlcnkgbGFyZ2UgZmluaXRlIHJhdGlvIGhlcmUgYW5kIHRyZWF0ZWQgYXMKICAgICAqICItPmluZmluaXR5IiBieSB0aGUgZ2FpbiBjb21wdXRlciAoc2xvcGUgZWZmZWN0aXZlbHkgMCBhYm92ZSB0aHJlc2hvbGQpLgogICAgICogY3JlYXRlTGltaXRlcigpIGluIGNhY29waG9ueS50cyBzZXRzIHRoZSByYXRpbyB0byB0aGlzIHZhbHVlLgogICAgICovCiAgICBjb25zdCBMSU1JVEVSX1JBVElPID0gMTAwMDsKICAgIGNsYXNzIER5bmFtaWNzV29ya2xldFByb2Nlc3NvciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvciB7CiAgICAgICAgLy8gT25lIHN0YXRlZnVsIGNvcmUgcGVyIGNoYW5uZWwgc28gZWFjaCBjaGFubmVsIGtlZXBzIGl0cyBvd24gYmFsbGlzdGljcwogICAgICAgIC8vIGVudmVsb3BlIChlcS4xNiBkZXRlY3RvciBzdGF0ZSkgYWNyb3NzIHByb2Nlc3MoKSBibG9ja3MuCiAgICAgICAgY29yZXMgPSBbXTsKICAgICAgICBzdGF0aWMgZ2V0IHBhcmFtZXRlckRlc2NyaXB0b3JzKCkgewogICAgICAgICAgICAvLyBEZWZhdWx0IFZBTFVFUyBjb21lIGZyb20gRFlOQU1JQ1NfREVGQVVMVFMgKGR5bmFtaWNzLWNvcmUudHMpIOKAlCB0aGUgc2luZ2xlCiAgICAgICAgICAgIC8vIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgd2l0aCB0aGUgZ2F0ZSByZWdyZXNzaW9uIHRlc3RzLiBSYW5nZXMgbGl2ZSBoZXJlCiAgICAgICAgICAgIC8vIGFuZCBjb3ZlciBjb21wcmVzc29yIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpLCBhbmQgZG93bndhcmQKICAgICAgICAgICAgLy8gZXhwYW5kZXIvZ2F0ZSAocmF0aW8gPCAxKSBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgWyJ0aHJlc2hvbGQiLCBEWU5BTUlDU19ERUZBVUxUUy50aHJlc2hvbGQsIC0xMDAsIDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmF0aW8iLCBEWU5BTUlDU19ERUZBVUxUUy5yYXRpbywgMC4wNSwgTElNSVRFUl9SQVRJTywgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJrbmVlIiwgRFlOQU1JQ1NfREVGQVVMVFMua25lZSwgMCwgNDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsiYXR0YWNrIiwgRFlOQU1JQ1NfREVGQVVMVFMuYXR0YWNrLCAwLCAxLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbInJlbGVhc2UiLCBEWU5BTUlDU19ERUZBVUxUUy5yZWxlYXNlLCAwLCA1LCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbIm1ha2V1cCIsIERZTkFNSUNTX0RFRkFVTFRTLm1ha2V1cCwgLTI0LCAyNCwgImstcmF0ZSJdLAogICAgICAgICAgICBdLm1hcCgoW25hbWUsIGRlZmF1bHRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBhdXRvbWF0aW9uUmF0ZV0pID0+ICh7CiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsCiAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbWluVmFsdWUsCiAgICAgICAgICAgICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsCiAgICAgICAgICAgICAgICBhdXRvbWF0aW9uUmF0ZTogYXV0b21hdGlvblJhdGUsCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbMF07CiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF07CiAgICAgICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQubGVuZ3RoID09PSAwIHx8ICFvdXRwdXQgfHwgb3V0cHV0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gay1yYXRlIHBhcmFtczogdGFrZSB0aGUgZmlyc3QgKGNvbnN0YW50LW92ZXItYmxvY2spIHZhbHVlLiBBIHJhdGlvIGF0IG9yCiAgICAgICAgICAgIC8vIGFib3ZlIHRoZSBsaW1pdGVyIHNlbnRpbmVsIGlzIG1hcHBlZCB0byArSW5maW5pdHkgc28gdGhlIGNvcmUncyBnYWluCiAgICAgICAgICAgIC8vIGNvbXB1dGVyIHVzZXMgdGhlIGV4YWN0IGxpbWl0ZXIgc2xvcGUgKDApIHJhdGhlciB0aGFuIDEvTElNSVRFUl9SQVRJTy4KICAgICAgICAgICAgY29uc3QgcmF0aW9QYXJhbSA9IHBhcmFtZXRlcnMucmF0aW9bMF07CiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICAgICAgICAgIHRocmVzaG9sZDogcGFyYW1ldGVycy50aHJlc2hvbGRbMF0sCiAgICAgICAgICAgICAgICByYXRpbzogcmF0aW9QYXJhbSA+PSBMSU1JVEVSX1JBVElPID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogcmF0aW9QYXJhbSwKICAgICAgICAgICAgICAgIGtuZWU6IHBhcmFtZXRlcnMua25lZVswXSwKICAgICAgICAgICAgICAgIGF0dGFjazogcGFyYW1ldGVycy5hdHRhY2tbMF0sCiAgICAgICAgICAgICAgICByZWxlYXNlOiBwYXJhbWV0ZXJzLnJlbGVhc2VbMF0sCiAgICAgICAgICAgICAgICBtYWtldXA6IHBhcmFtZXRlcnMubWFrZXVwWzBdLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBjaGFubmVsQ291bnQgPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIG91dHB1dC5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29yZXNbY2hdKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3Jlc1tjaF0gPSBuZXcgRHluYW1pY3NQcm9jZXNzb3Ioc2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXS5wcm9jZXNzKGlucHV0W2NoXSwgb3V0cHV0W2NoXSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBjb25zb2xlLmluZm8oYCR7V09SS0xFVF9MT0dfUFJFRklYfSBtb2R1bGUgZXZhbHVhdGluZ2ApOwogICAgdHJ5IHsKICAgICAgICByZWdpc3RlckVmZmVjdFByb2Nlc3NvcigiZHluYW1pY3MiLCBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IpOwogICAgICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IHJlZ2lzdGVyUHJvY2Vzc29yIGNvbXBsZXRlYCk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgZmFpbGVkYCwgZXJyb3IpOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQoKICAgIGV4cG9ydHMuRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yID0gRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yOwoKICAgIHJldHVybiBleHBvcnRzOwoKfSkoe30pOwovLyMgc291cmNlTWFwcGluZ1VSTD1keW5hbWljcy1idW5kbGUuanMubWFwCg==";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"dynamics-bundle.js_url.mjs","names":[],"sources":["../../src/bundles/dynamics-bundle.js?url"],"sourcesContent":["export default \"data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIER5bmFtaWNzIEF1ZGlvV29ya2xldCBzaGVsbCDigJQgdGhpbiBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgdGhhdCBkZWxlZ2F0ZXMgQUxMCiAgICAgKiBEU1AgbWF0aCB0byB0aGUgY29udGV4dC1mcmVlIER5bmFtaWNzUHJvY2Vzc29yIGluIGR5bmFtaWNzLWNvcmUudHMuIE1pcnJvcnMKICAgICAqIHRoZSBkYXR0b3Jyby1yZXZlcmIudHMgLyBzdGVyZW8tdG8tYmZvcm1hdC50cyBjb3JlL3NoZWxsIHNwbGl0OiB0aGlzIGZpbGUKICAgICAqIG93bnMgb25seSB0aGUgd29ya2xldCBwbHVtYmluZyAocGFyYW1ldGVyRGVzY3JpcHRvcnMsIHByb2Nlc3MoKSwgdGhlCiAgICAgKiByZWdpc3RlclByb2Nlc3NvciBjYWxsKTsgdGhlIGFsZ29yaXRobSBsaXZlcyBpbiB0aGUgdW5pdC10ZXN0ZWQgY29yZS4KICAgICAqCiAgICAgKiBBbGdvcml0aG06IGZlZWQtZm9yd2FyZCBkeW5hbWljIHJhbmdlIGNvbXByZXNzb3IvbGltaXRlci9leHBhbmRlci9nYXRlIHBlcgogICAgICogR2lhbm5vdWxpcywgTWFzc2JlcmcgJiBSZWlzcyAyMDEyIChzZWUgZHluYW1pY3MtY29yZS50cyBoZWFkZXIgZm9yIHRoZSBmdWxsCiAgICAgKiBjaXRhdGlvbiBhbmQgcGVyLWVxdWF0aW9uIGNvbW1lbnRzKS4KICAgICAqLwogICAgY29uc3QgV09SS0xFVF9MT0dfUFJFRklYID0gIltjYWNvcGhvbnkvd29ya2xldDpkeW5hbWljc10iOwogICAgLyoqCiAgICAgKiBSYXRpbyBzZW50aW5lbDogdGhlIHdvcmtsZXQncyBBdWRpb1BhcmFtIGNhbm5vdCBjYXJyeSArSW5maW5pdHksIHNvIGEKICAgICAqIGxpbWl0ZXIgaXMgZXhwcmVzc2VkIGFzIGEgdmVyeSBsYXJnZSBmaW5pdGUgcmF0aW8gaGVyZSBhbmQgdHJlYXRlZCBhcwogICAgICogIi0+aW5maW5pdHkiIGJ5IHRoZSBnYWluIGNvbXB1dGVyIChzbG9wZSBlZmZlY3RpdmVseSAwIGFib3ZlIHRocmVzaG9sZCkuCiAgICAgKiBjcmVhdGVMaW1pdGVyKCkgaW4gY2Fjb3Bob255LnRzIHNldHMgdGhlIHJhdGlvIHRvIHRoaXMgdmFsdWUuCiAgICAgKi8KICAgIGNvbnN0IExJTUlURVJfUkFUSU8gPSAxMDAwOwogICAgY2xhc3MgRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHsKICAgICAgICAvLyBPbmUgc3RhdGVmdWwgY29yZSBwZXIgY2hhbm5lbCBzbyBlYWNoIGNoYW5uZWwga2VlcHMgaXRzIG93biBiYWxsaXN0aWNzCiAgICAgICAgLy8gZW52ZWxvcGUgKGVxLjE2IGRldGVjdG9yIHN0YXRlKSBhY3Jvc3MgcHJvY2VzcygpIGJsb2Nrcy4KICAgICAgICBjb3JlcyA9IFtdOwogICAgICAgIHN0YXRpYyBnZXQgcGFyYW1ldGVyRGVzY3JpcHRvcnMoKSB7CiAgICAgICAgICAgIC8vIERlZmF1bHQgVkFMVUVTIGNvbWUgZnJvbSBEWU5BTUlDU19ERUZBVUxUUyAoZHluYW1pY3MtY29yZS50cykg4oCUIHRoZSBzaW5nbGUKICAgICAgICAgICAgLy8gc291cmNlIG9mIHRydXRoIHNoYXJlZCB3aXRoIHRoZSBnYXRlIHJlZ3Jlc3Npb24gdGVzdHMuIFJhbmdlcyBsaXZlIGhlcmUKICAgICAgICAgICAgLy8gYW5kIGNvdmVyIGNvbXByZXNzb3IgKHJhdGlvID49IDEpLCBsaW1pdGVyIChyYXRpbyAtPiBsYXJnZSksIGFuZCBkb3dud2FyZAogICAgICAgICAgICAvLyBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpIGZyb20gb25lIHBhcmFtZXRlciBzZXQuCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBbInRocmVzaG9sZCIsIERZTkFNSUNTX0RFRkFVTFRTLnRocmVzaG9sZCwgLTEwMCwgMCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJyYXRpbyIsIERZTkFNSUNTX0RFRkFVTFRTLnJhdGlvLCAwLjA1LCBMSU1JVEVSX1JBVElPLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbImtuZWUiLCBEWU5BTUlDU19ERUZBVUxUUy5rbmVlLCAwLCA0MCwgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJhdHRhY2siLCBEWU5BTUlDU19ERUZBVUxUUy5hdHRhY2ssIDAsIDEsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmVsZWFzZSIsIERZTkFNSUNTX0RFRkFVTFRTLnJlbGVhc2UsIDAsIDUsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsibWFrZXVwIiwgRFlOQU1JQ1NfREVGQVVMVFMubWFrZXVwLCAtMjQsIDI0LCAiay1yYXRlIl0sCiAgICAgICAgICAgIF0ubWFwKChbbmFtZSwgZGVmYXVsdFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGF1dG9tYXRpb25SYXRlXSkgPT4gKHsKICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSwKICAgICAgICAgICAgICAgIG1heFZhbHVlOiBtYXhWYWx1ZSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpb25SYXRlOiBhdXRvbWF0aW9uUmF0ZSwKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBwcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycykgewogICAgICAgICAgICBjb25zdCBpbnB1dCA9IGlucHV0c1swXTsKICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTsKICAgICAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC5sZW5ndGggPT09IDAgfHwgIW91dHB1dCB8fCBvdXRwdXQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBrLXJhdGUgcGFyYW1zOiB0YWtlIHRoZSBmaXJzdCAoY29uc3RhbnQtb3Zlci1ibG9jaykgdmFsdWUuIEEgcmF0aW8gYXQgb3IKICAgICAgICAgICAgLy8gYWJvdmUgdGhlIGxpbWl0ZXIgc2VudGluZWwgaXMgbWFwcGVkIHRvICtJbmZpbml0eSBzbyB0aGUgY29yZSdzIGdhaW4KICAgICAgICAgICAgLy8gY29tcHV0ZXIgdXNlcyB0aGUgZXhhY3QgbGltaXRlciBzbG9wZSAoMCkgcmF0aGVyIHRoYW4gMS9MSU1JVEVSX1JBVElPLgogICAgICAgICAgICBjb25zdCByYXRpb1BhcmFtID0gcGFyYW1ldGVycy5yYXRpb1swXTsKICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICAgICAgdGhyZXNob2xkOiBwYXJhbWV0ZXJzLnRocmVzaG9sZFswXSwKICAgICAgICAgICAgICAgIHJhdGlvOiByYXRpb1BhcmFtID49IExJTUlURVJfUkFUSU8gPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiByYXRpb1BhcmFtLAogICAgICAgICAgICAgICAga25lZTogcGFyYW1ldGVycy5rbmVlWzBdLAogICAgICAgICAgICAgICAgYXR0YWNrOiBwYXJhbWV0ZXJzLmF0dGFja1swXSwKICAgICAgICAgICAgICAgIHJlbGVhc2U6IHBhcmFtZXRlcnMucmVsZWFzZVswXSwKICAgICAgICAgICAgICAgIG1ha2V1cDogcGFyYW1ldGVycy5tYWtldXBbMF0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgb3V0cHV0Lmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb3Jlc1tjaF0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXSA9IG5ldyBEeW5hbWljc1Byb2Nlc3NvcihzYW1wbGVSYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuY29yZXNbY2hdLnByb2Nlc3MoaW5wdXRbY2hdLCBvdXRwdXRbY2hdLCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IG1vZHVsZSBldmFsdWF0aW5nYCk7CiAgICB0cnkgewogICAgICAgIHJlZ2lzdGVyUHJvY2Vzc29yKCJkeW5hbWljcyIsIER5bmFtaWNzV29ya2xldFByb2Nlc3Nvcik7CiAgICAgICAgY29uc29sZS5pbmZvKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgY29tcGxldGVgKTsKICAgIH0KICAgIGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7V09SS0xFVF9MT0dfUFJFRklYfSByZWdpc3RlclByb2Nlc3NvciBmYWlsZWRgLCBlcnJvcik7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CgogICAgZXhwb3J0cy5EeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IgPSBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3I7CgogICAgcmV0dXJuIGV4cG9ydHM7Cgp9KSh7fSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWR5bmFtaWNzLWJ1bmRsZS5qcy5tYXAK\""],"mappings":";AAAA,IAAA,IAAe"}
1
+ {"version":3,"file":"dynamics-bundle.js_url.mjs","names":[],"sources":["../../src/bundles/dynamics-bundle.js?url"],"sourcesContent":["export default \"data:text/javascript;base64,dmFyIGR5bmFtaWNzID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoKICAgICAqIER5bmFtaWNzIHByb2Nlc3NvciBjb3JlIOKAlCBjb250ZXh0LWZyZWUgRFNQIG1hdGggZm9yIGEgZmVlZC1mb3J3YXJkIGR5bmFtaWMKICAgICAqIHJhbmdlIGNvbXByZXNzb3IgLyBsaW1pdGVyIC8gZXhwYW5kZXIgLyBnYXRlLgogICAgICoKICAgICAqIEltcGxlbWVudHMgdGhlIGNhbm9uaWNhbCBkZXNpZ24gZnJvbToKICAgICAqICAgRC4gR2lhbm5vdWxpcywgTS4gTWFzc2JlcmcsIEouIEQuIFJlaXNzLAogICAgICogICAiRGlnaXRhbCBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgRGVzaWduIOKAlCBBIFR1dG9yaWFsIGFuZCBBbmFseXNpcyIsCiAgICAgKiAgIEouIEF1ZGlvIEVuZy4gU29jLiwgVm9sLiA2MCwgTm8uIDYsIHBwLiAzOTktNDA4ICgyMDEyKS4KICAgICAqCiAgICAgKiBUb3BvbG9neSAodGhlIHBhcGVyJ3MgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSwgcC4zOTkgYWJzdHJhY3QgLyBwcC40MDQtNDA1KToKICAgICAqICAgLSBmZWVkLWZvcndhcmQgKHNpZGUtY2hhaW4gZHJpdmVuIGZyb20gdGhlIElOUFVUKSwKICAgICAqICAgLSBnYWluIGNvbXB1dGVyID0gc3RhdGljIGRCLT5kQiBjdXJ2ZSAoZXFzIDItNCksCiAgICAgKiAgIC0gbGV2ZWwgZGV0ZWN0b3IgcGxhY2VkIGluIHRoZSBMT0cgZG9tYWluIEFGVEVSIHRoZSBnYWluIGNvbXB1dGVyCiAgICAgKiAgICAgKGVxIDIzKTogc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBjb250cm9sIHNpZ25hbCwgbm90IHRoZSByYXcgbGV2ZWwsCiAgICAgKiAgIC0gc21vb3RoIGJyYW5jaGluZyBwZWFrIGRldGVjdG9yIGZvciB0aGUgYmFsbGlzdGljcyAoZXEgMTYpLgogICAgICoKICAgICAqIEEgU0lOR0xFIGdhaW4gY29tcHV0ZXIsIHBhcmFtZXRlcml6ZWQgYnkgdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgVywKICAgICAqIHNlcnZlcyBhbGwgZm91ciBiZWhhdmlvdXJzIChHaWFubm91bGlzIDIwMTIsIHAuNDAzOyBzZWUgbm90ZXMubWQKICAgICAqICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiKToKICAgICAqICAgLSBSID4gMSAgICAgICAgICAgIC0+IGNvbXByZXNzb3IgKHNsb3BlIDEvUiA8IDEgYWJvdmUgVCksCiAgICAgKiAgIC0gUiAtPiBpbmZpbml0eSAgICAgLT4gbGltaXRlciAoc2xvcGUgLT4gMCBhYm92ZSBULCBlcXMgMTgtMTkpLAogICAgICogICAtIFIgPCAxICAgICAgICAgICAgLT4gZG93bndhcmQgZXhwYW5kZXIgKHNsb3BlID4gMSBCRUxPVyBUKSwKICAgICAqICAgLSBleHRyZW1lIFIgPCAxICAgIC0+IGdhdGUgKHZlcnkgc3RlZXAgZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQpLgogICAgICoKICAgICAqIFRoaXMgZmlsZSBob2xkcyBPTkxZIHB1cmUgbnVtZXJpYyBtYXRoIChvcGVyYXRlcyBvbiBwbGFpbiBudW1iZXJzIGFuZAogICAgICogRmxvYXQzMkFycmF5KS4gSXQgaGFzIG5vIEF1ZGlvV29ya2xldCAvIGdsb2JhbCBkZXBlbmRlbmNpZXMgc28gaXQgY2FuIGJlCiAgICAgKiB1bml0LXRlc3RlZCBkaXJlY3RseSAodGhlIHdvcmtsZXQgc2hlbGwgaW4gZHluYW1pY3MudHMgZGVsZWdhdGVzIHRvIGl0KS4KICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZhdWx0IEF1ZGlvUGFyYW0gdmFsdWVzIGZvciB0aGUgZHluYW1pY3Mgd29ya2xldCwgaW4gdGhlIHdvcmtsZXQncyBvd24KICAgICAqIHVuaXRzLiBTSU5HTEUgU09VUkNFIE9GIFRSVVRIIOKAlCB0aGUgd29ya2xldCdzIGBwYXJhbWV0ZXJEZXNjcmlwdG9yc2AKICAgICAqIChkeW5hbWljcy50cykgYnVpbGRzIGl0cyBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGFibGUsIGFuZCB0ZXN0cyB0aGF0IG5lZWQgdGhlCiAgICAgKiBzaGlwcGVkIGRlZmF1bHRzIGltcG9ydCBpdCBoZXJlIHJhdGhlciB0aGFuIHJlLXR5cGluZyBsaXRlcmFscy4gTGl2aW5nIGluIHRoZQogICAgICogd29ya2xldC1nbG9iYWwtZnJlZSBjb3JlIGtlZXBzIGl0IGltcG9ydGFibGUgZnJvbSBwbGFpbiBOb2RlIHRlc3QgcnVubmVycy4KICAgICAqCiAgICAgKiBEZWZhdWx0czogYSBnZW50bGUsIGF1ZGlibGUtYnV0LXNhZmUgY29tcHJlc3Nvci4gUmF0aW9zIGNvdmVyIGNvbXByZXNzb3IKICAgICAqIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpIGFuZCBkb3dud2FyZCBleHBhbmRlci9nYXRlIChyYXRpbyA8IDEpCiAgICAgKiBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICovCiAgICBjb25zdCBEWU5BTUlDU19ERUZBVUxUUyA9IHsKICAgICAgICB0aHJlc2hvbGQ6IC0yNCwKICAgICAgICByYXRpbzogNCwKICAgICAgICBrbmVlOiA2LAogICAgICAgIGF0dGFjazogMC4wMDMsCiAgICAgICAgcmVsZWFzZTogMC4yNSwKICAgICAgICBtYWtldXA6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBTbWFsbGVzdCBsaW5lYXIgbGV2ZWwgd2UgYXJlIHdpbGxpbmcgdG8gdGFrZSBhIGxvZ2FyaXRobSBvZi4gQmVsb3cgdGhpcyB0aGUKICAgICAqIGlucHV0IGlzIHRyZWF0ZWQgYXMgc2lsZW5jZSAoZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCA9IDApLCBhdm9pZGluZyAtSW5maW5pdHkKICAgICAqIGRCIGZyb20gbG9nMTAoMCkuCiAgICAgKi8KICAgIGNvbnN0IExFVkVMX0ZMT09SID0gMWUtMTI7CiAgICAvKioKICAgICAqIFN0YXRpYyBnYWluIGNvbXB1dGVyIOKAlCBtYXBzIGFuIGlucHV0IGxldmVsIHhfRyAoZEIpIHRvIGFuIG91dHB1dCBsZXZlbAogICAgICogeV9HIChkQikgZ2l2ZW4gdGhyZXNob2xkIFQsIHJhdGlvIFIgYW5kIGtuZWUgd2lkdGggVy4KICAgICAqCiAgICAgKiBIYXJkIGtuZWUgKFcgPSAwKSwgR2lhbm5vdWxpcyAyMDEyIGVxLjM6CiAgICAgKiAgIHlfRyA9IHhfRyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhfRyA8PSBUCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgZm9yIHhfRyA+ICBUCiAgICAgKgogICAgICogU29mdCBrbmVlIChXID4gMCksIGVxLjQg4oCUIHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uIGFjcm9zcyArLy0gVy8yIGFyb3VuZCBUOgogICAgICogICB5X0cgPSB4X0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMih4X0ctVCkgPCAtVwogICAgICogICB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykgICAgICAgICAgfDIoeF9HLVQpfCA8PSBXCiAgICAgKiAgIHlfRyA9IFQgKyAoeF9HIC0gVCkgLyBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKHhfRy1UKSA+ICBXCiAgICAgKgogICAgICogQSBsaW1pdGVyIGlzIFIgLT4gaW5maW5pdHk6IDEvUiAtPiAwLCBzbyBhYm92ZSBUIHRoZSBjdXJ2ZSBmbGF0dGVucyB0byB5X0cgPSBUCiAgICAgKiAoZXFzIDE4LTE5KS4gV2UgaGFuZGxlIHRoZSBpbmZpbml0ZS96ZXJvLXNsb3BlIGNhc2UgZXhwbGljaXRseSB0byBhdm9pZAogICAgICogZGl2aXNpb24gYnkgaW5maW5pdHkuCiAgICAgKgogICAgICogRG93bndhcmQgRVhQQU5TSU9OIChSIDwgMSwgR2lhbm5vdWxpcyAyMDEyIHAuNDAzICJmb3IgcmF0aW9zIDwgMSAuLi4gdGhlCiAgICAgKiB2YXJpYWJsZSBzaW1wbHkgYmVjb21lcyBzbWFsbGVyIHRoYW4gLTEiKTogdGhlIHNsb3BlLWFsdGVyZWQgcmVnaW9uIGlzIEJFTE9XCiAgICAgKiB0aGUgdGhyZXNob2xkIHJhdGhlciB0aGFuIGFib3ZlIGl0LiBXaXRoIHNsb3BlIDEvUiA+IDEgYXBwbGllZCBmb3IgeF9HIDwgVCwKICAgICAqIHlfRyA9IFQgKyAoeF9HIC0gVCkvUiBpcyBtb3JlIG5lZ2F0aXZlIHRoYW4geF9HLCBzbyBxdWlldCBzaWduYWxzIGFyZSBwdXNoZWQKICAgICAqIGZ1cnRoZXIgZG93biAoaW5jcmVhc2luZyBkeW5hbWljIHJhbmdlOyBhbiBleHRyZW1lIFI8MSByYXRpbyBpcyBhIGdhdGUpLgogICAgICogU2VlIG5vdGVzLm1kICJFeHBhbmRlciAvIEdhdGUgZnJvbSB0aGUgU0FNRSBtYWNoaW5lcnkiLiBUaGUgY29tcHJlc3NvciBicmFuY2gKICAgICAqIChSID49IDEpIGFuZCB0aGUgZXhwYW5kZXIgYnJhbmNoIChSIDwgMSkgYXJlIG1pcnJvciBpbWFnZXMgYWJvdXQgVCwgc28gb25lCiAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IFQvUi9XIHNlcnZlcyBjb21wcmVzc29yLCBsaW1pdGVyLCBleHBhbmRlciBhbmQgZ2F0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpIHsKICAgICAgICBjb25zdCBzbG9wZSA9IHJhdGlvID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogMSAvIHJhdGlvOyAvLyAxL1I7IGxpbWl0ZXIgLT4gMAogICAgICAgIGNvbnN0IGRlbHRhID0geEcgLSB0aHJlc2hvbGQ7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlciA9IHJhdGlvIDwgMTsgLy8gUiA8IDEgPT4gZG93bndhcmQgZXhwYW5zaW9uIGJlbG93IFQKICAgICAgICBpZiAoaXNFeHBhbmRlcikgewogICAgICAgICAgICAvLyBEb3dud2FyZCBleHBhbmRlcjogc2xvcGUtYWx0ZXJlZCByZWdpb24gaXMgQkVMT1cgdGhyZXNob2xkIChlcXMgMi00CiAgICAgICAgICAgIC8vIG1pcnJvcmVkKS4gU29mdCBrbmVlIGNlbnRlcmVkIG9uIFQgKGVxLjQgZm9ybSwgbWlycm9yZWQgdG8gdGhlIGxvd2VyCiAgICAgICAgICAgIC8vIHNpZGUpOiBibGVuZCB0aGUgdW5pdHkgc2xvcGUgKGFib3ZlKSBpbnRvIHNsb3BlIDEvUiAoYmVsb3cpLgogICAgICAgICAgICBpZiAoa25lZSA+IDAgJiYgTWF0aC5hYnMoMiAqIGRlbHRhKSA8PSBrbmVlKSB7CiAgICAgICAgICAgICAgICAvLyBlcS40IHF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uLCBtaXJyb3JlZCBhYm91dCBUIGZvciB0aGUgZXhwYW5kZXIuCiAgICAgICAgICAgICAgICAvLyBUaGUgZXhwYW5kZXIncyBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBCRUxPVyBULCBzbyB0aGUga25lZSBtdXN0IGpvaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBzbG9wZSBsaW5lIGF0IHRoZSBMT1dFUiBlZGdlIChkZWx0YSA9IC1XLzIpIGFuZCB1bml0eSBhdCB0aGUgVVBQRVIKICAgICAgICAgICAgICAgIC8vIGVkZ2UgKGRlbHRhID0gK1cvMikuIEFuY2hvciB0aGUgcGFyYWJvbGEgdG8gdGhlIHVwcGVyIGVkZ2UgKHQgPSAwIHRoZXJlKQogICAgICAgICAgICAgICAgLy8gYW5kIHN1YnRyYWN0IHRoZSBjdXJ2YXR1cmUgc28geV9HIG1lZXRzIHRoZSBzbG9wZSBsaW5lIGJlbG93OiB0aGlzCiAgICAgICAgICAgICAgICAvLyB5aWVsZHMgeV9HIDw9IHhfRyBldmVyeXdoZXJlIChuZXZlciBib29zdHMpIGFuZCBDMC9DMSBjb250aW51aXR5IGF0IGJvdGgKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIChzbG9wZSAxL1IgYmVsb3csIHVuaXR5IGFib3ZlKS4gVGhlIE1JTlVTIHNpZ24gaXMgdGhlIG1pcnJvciBvZgogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXByZXNzb3IgYnJhbmNoJ3MgUExVUyDigJQgc2FtZSBlcS40IGZvcm0sIG9wcG9zaXRlIGFsdGVyZWQgc2lkZS4KICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkZWx0YSAtIGtuZWUgLyAyOyAvLyAwIGF0IHRoZSB1cHBlciBlZGdlIChkZWx0YSA9ICtXLzIpCiAgICAgICAgICAgICAgICByZXR1cm4geEcgLSAoKHNsb3BlIC0gMSkgKiAodCAqIHQpKSAvICgyICoga25lZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbHRhID49IDApIHsKICAgICAgICAgICAgICAgIC8vIHhfRyA+PSBUIChhYm92ZSB0aHJlc2hvbGQpIOKAlCB1bml0eSBmb3IgYSBkb3dud2FyZCBleHBhbmRlci4KICAgICAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB4X0cgPCBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCBzbG9wZSAxL1IgPiAxIHB1c2hlcyB0aGUgbGV2ZWwgZG93bi4KICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCArIGRlbHRhICogc2xvcGU7CiAgICAgICAgfQogICAgICAgIC8vIENvbXByZXNzb3IgLyBsaW1pdGVyIChSID49IDEpOiBzbG9wZS1hbHRlcmVkIHJlZ2lvbiBpcyBBQk9WRSB0aHJlc2hvbGQuCiAgICAgICAgLy8gU29mdCBrbmVlIChlcS40IG1pZGRsZSBicmFuY2gpOiAyfHhfRyAtIFR8IDw9IFcuCiAgICAgICAgaWYgKGtuZWUgPiAwICYmIE1hdGguYWJzKDIgKiBkZWx0YSkgPD0ga25lZSkgewogICAgICAgICAgICAvLyBlcS40OiB5X0cgPSB4X0cgKyAoMS9SIC0gMSkoeF9HIC0gVCArIFcvMileMiAvICgyVykKICAgICAgICAgICAgY29uc3QgdCA9IGRlbHRhICsga25lZSAvIDI7CiAgICAgICAgICAgIHJldHVybiB4RyArICgoc2xvcGUgLSAxKSAqICh0ICogdCkpIC8gKDIgKiBrbmVlKTsKICAgICAgICB9CiAgICAgICAgLy8gSGFyZCBrbmVlIC8gb3V0c2lkZSBrbmVlIHJlZ2lvbiAoZXEuMyAvIGVxLjQgb3V0ZXIgYnJhbmNoZXMpLgogICAgICAgIGlmIChkZWx0YSA8PSAwKSB7CiAgICAgICAgICAgIC8vIHhfRyA8PSBUIChiZWxvdyB0aHJlc2hvbGQpIOKAlCB1bml0eS4gKGVxLjMgZmlyc3QgY2FzZS4pCiAgICAgICAgICAgIHJldHVybiB4RzsKICAgICAgICB9CiAgICAgICAgLy8geF9HID4gVCAoYWJvdmUgdGhyZXNob2xkKSDigJQgc2xvcGUgMS9SLiAoZXEuMyBzZWNvbmQgY2FzZTsgZXEuNCB1cHBlciBicmFuY2guKQogICAgICAgIHJldHVybiB0aHJlc2hvbGQgKyBkZWx0YSAqIHNsb3BlOwogICAgfQogICAgLyoqCiAgICAgKiBUaW1lLWNvbnN0YW50IC0+IG9uZS1wb2xlIGNvZWZmaWNpZW50IG1hcHBpbmcsIEdpYW5ub3VsaXMgMjAxMiBlcS43OgogICAgICogICBhbHBoYSA9IGV4cCgtMSAvICh0YXUgKiBmX3MpKQogICAgICogdGF1IGlzIHRoZSB0aW1lIHRvIHJlYWNoIDEgLSAxL2Ugb2YgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGF1ID4gMCwgZl9zID4gMAogICAgICogdGhlIHJlc3VsdCBsaWVzIGluICgwLCAxKTsgbGFyZ2VyIHRhdSAtPiBhbHBoYSBjbG9zZXIgdG8gMSAoc2xvd2VyKS4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudCh0YXUsIHNhbXBsZVJhdGUpIHsKICAgICAgICBpZiAodGF1IDw9IDApCiAgICAgICAgICAgIHJldHVybiAwOyAvLyBkZWdlbmVyYXRlOiBpbnN0YW50YW5lb3VzIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuIE1hdGguZXhwKC0xIC8gKHRhdSAqIHNhbXBsZVJhdGUpKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGVmdWwgZmVlZC1mb3J3YXJkIGR5bmFtaWNzIHByb2Nlc3Nvci4gT25lIGluc3RhbmNlIG93bnMgdGhlIGJhbGxpc3RpY3MKICAgICAqIHN0YXRlICh0aGUgc21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gZW52ZWxvcGUgeV9MIG9mIHRoZSBlcS4xNiBkZXRlY3RvcikgYW5kIGlzCiAgICAgKiByZXVzZWQgYmxvY2stdG8tYmxvY2sgc28gdGhlIElJUiBtZW1vcnkgaXMgcHJlc2VydmVkIGFjcm9zcyBwcm9jZXNzKCkgY2FsbHMg4oCUCiAgICAgKiBjb25zdHJ1Y3RpbmcgYSBmcmVzaCBpbnN0YW5jZSBwZXIgYmxvY2sgd291bGQgcmVzZXQgdGhlIGVudmVsb3BlIGFuZCBwcm9kdWNlCiAgICAgKiBhdWRpYmxlIHRyYW5zaWVudHMgKHNhbWUgaGF6YXJkIGRvY3VtZW50ZWQgZm9yIHRoZSBiLWZvcm1hdCB1cG1peGVyKS4KICAgICAqLwogICAgY2xhc3MgRHluYW1pY3NQcm9jZXNzb3IgewogICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgLyoqCiAgICAgICAgICogU21vb3RoZWQgZ2Fpbi1yZWR1Y3Rpb24gY29udHJvbCBlbnZlbG9wZSB5X0xbbi0xXSAodGhlIHN0YXRlIG9mIHRoZSBlcS4xNgogICAgICAgICAqIHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvcikuIE9wZXJhdGVzIG9uIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwKICAgICAgICAgKiB4X0wgPSB4X0cgLSB5X0cgKGVxLjIzKSwgd2hpY2ggaXMgMCAobm8gcmVkdWN0aW9uKSB3aGVuIG5vdCBjb21wcmVzc2luZywgc28KICAgICAgICAgKiB0aGUgZW52ZWxvcGUgcmVzdHMgYXQgMC4KICAgICAgICAgKi8KICAgICAgICBlbnZlbG9wZURiID0gMDsKICAgICAgICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlKSB7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBSZXNldCB0aGUgYmFsbGlzdGljcyBzdGF0ZSAoZS5nLiBvbiBhIGRpc2NvbnRpbnVpdHkpLiAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLmVudmVsb3BlRGIgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIG9uZSBzYW1wbGUsIHJldHVybmluZyB0aGUgZ2Fpbi1hcHBsaWVkIG91dHB1dCBzYW1wbGUuCiAgICAgICAgICoKICAgICAgICAgKiBTaWduYWwgZmxvdyAoR2lhbm5vdWxpcyAyMDEyIHJlY29tbWVuZGVkIGZlZWQtZm9yd2FyZCwgbG9nLWRvbWFpbiBkZXRlY3RvcgogICAgICAgICAqIGFmdGVyIHRoZSBnYWluIGNvbXB1dGVyKToKICAgICAgICAgKiAgIDEuIHhfRyA9IDIwIGxvZzEwIHx4fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEuMjMgbGluZSAxKQogICAgICAgICAqICAgMi4geV9HID0gZ2FpbiBjb21wdXRlcih4X0c7IFQsIFIsIFcpICAgICAgICAgICAgICAgICAgIChlcXMgMy00KQogICAgICAgICAqICAgMy4geF9MID0geF9HIC0geV9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDIpCiAgICAgICAgICogICAgICDigJQgdGhlIGluc3RhbnRhbmVvdXMgZ2Fpbi1yZWR1Y3Rpb24gKD49IDAgZm9yIGNvbXByZXNzaW9uL2xpbWl0aW5nLAogICAgICAgICAqICAgICAgICBhbHNvID49IDAgZm9yIGRvd253YXJkIGV4cGFuc2lvbikuCiAgICAgICAgICogICA0LiBzbW9vdGggYnJhbmNoaW5nIHBlYWsgZGV0ZWN0b3Igb24geF9MICAgICAgICAgICAgICAgKGVxLjE2KQogICAgICAgICAqICAgNS4gY19kQiA9IC15X0wgKyBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcS4yMyBsaW5lIDMsIGVxLjEpCiAgICAgICAgICogICA2LiB5W25dID0gMTBeKGNfZEIgLyAyMCkgKiB4W25dICAgICAgICAgICAgICAgICAgICAgICAgKGVxLjEgbGluZWFyIGZvcm0pCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gYWxwaGFBdHRhY2sgIHByZWNvbXB1dGVkIGF0dGFjayBjb2VmZmljaWVudCBhbHBoYV9BIChlcS43KQogICAgICAgICAqIEBwYXJhbSBhbHBoYVJlbGVhc2UgcHJlY29tcHV0ZWQgcmVsZWFzZSBjb2VmZmljaWVudCBhbHBoYV9SIChlcS43KQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NTYW1wbGUoeCwgdGhyZXNob2xkLCByYXRpbywga25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgbWFrZXVwKSB7CiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5hYnMoeCk7CiAgICAgICAgICAgIC8vIGVxLjIzIGxpbmUgMTogeF9HID0gMjAgbG9nMTAgfHh8LiBGbG9vciBzaWxlbmNlIHRvIGF2b2lkIC1JbmYgZEIuCiAgICAgICAgICAgIGNvbnN0IHhHID0gbGV2ZWwgPCBMRVZFTF9GTE9PUiA/IDIwICogTWF0aC5sb2cxMChMRVZFTF9GTE9PUikgOiAyMCAqIE1hdGgubG9nMTAobGV2ZWwpOwogICAgICAgICAgICAvLyBlcXMgMy00OiBzdGF0aWMgY3VydmUuCiAgICAgICAgICAgIGNvbnN0IHlHID0gY29tcHV0ZVN0YXRpY0dhaW4oeEcsIHRocmVzaG9sZCwgcmF0aW8sIGtuZWUpOwogICAgICAgICAgICAvLyBlcS4yMyBsaW5lIDI6IGdhaW4tcmVkdWN0aW9uIGNvbnRyb2wgc2lnbmFsIChsb2cgZG9tYWluLCBhZnRlciB0aGUgZ2FpbgogICAgICAgICAgICAvLyBjb21wdXRlcikuIHhfTCA+PSAwIG1lYW5zICJ0aGlzIG11Y2ggcmVkdWN0aW9uIGlzIHdhbnRlZCByaWdodCBub3ciLgogICAgICAgICAgICBjb25zdCB4TCA9IHhHIC0geUc7CiAgICAgICAgICAgIC8vIGVxLjE2IHNtb290aCBicmFuY2hpbmcgcGVhayBkZXRlY3RvciDigJQgc21vb3RoIHRoZSBnYWluLXJlZHVjdGlvbiBzaWduYWwuCiAgICAgICAgICAgIC8vIEF0dGFjayBicmFuY2ggd2hlbiBtb3JlIHJlZHVjdGlvbiBpcyB3YW50ZWQgdGhhbiBjdXJyZW50bHkgYXBwbGllZDsKICAgICAgICAgICAgLy8gcmVsZWFzZSBicmFuY2ggb3RoZXJ3aXNlLiBUaGUgc21vb3RoICh2cyBwbGFpbikgYnJhbmNoaW5nIGZvcm0gbG93LXBhc3NlcwogICAgICAgICAgICAvLyBCT1RIIGJyYW5jaGVzIHNvIHRoZXJlIGlzIG5vIGRpc2NvbnRpbnVpdHkgYXQgdGhlIGF0dGFjazwtPnJlbGVhc2Ugc3dpdGNoLgogICAgICAgICAgICBpZiAoeEwgPiB0aGlzLmVudmVsb3BlRGIpIHsKICAgICAgICAgICAgICAgIC8vIGF0dGFjazogeF9MW25dID4geV9MW24tMV0KICAgICAgICAgICAgICAgIHRoaXMuZW52ZWxvcGVEYiA9IGFscGhhQXR0YWNrICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYUF0dGFjaykgKiB4TDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbGVhc2U6IHhfTFtuXSA8PSB5X0xbbi0xXQogICAgICAgICAgICAgICAgdGhpcy5lbnZlbG9wZURiID0gYWxwaGFSZWxlYXNlICogdGhpcy5lbnZlbG9wZURiICsgKDEgLSBhbHBoYVJlbGVhc2UpICogeEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXEuMjMgbGluZSAzICsgZXEuMSBtYWtlLXVwOiBjb250cm9sIHZvbHRhZ2UgY19kQiA9IC15X0wgKyBNLgogICAgICAgICAgICBjb25zdCBjb250cm9sRGIgPSAtdGhpcy5lbnZlbG9wZURiICsgbWFrZXVwOwogICAgICAgICAgICAvLyBlcS4xIGxpbmVhciBmb3JtOiB5W25dID0gY1tuXSAqIHhbbl0sIHdpdGggY1tuXSA9IDEwXihjX2RCLzIwKS4KICAgICAgICAgICAgY29uc3QgY29udHJvbExpbmVhciA9IDEwICoqIChjb250cm9sRGIgLyAyMCk7CiAgICAgICAgICAgIHJldHVybiBjb250cm9sTGluZWFyICogeDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBhIGJsb2NrLiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBtYXkgYWxpYXMgKGluLXBsYWNlIGlzIGZpbmUpLiBUaGUKICAgICAgICAgKiBhdHRhY2svcmVsZWFzZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGJsb2NrIChrLXJhdGUgcGFyYW1zKTsKICAgICAgICAgKiB0aGUgcGVyLXNhbXBsZSBzaWRlLWNoYWluIHJ1bnMgdGhlIGVxLjE2IGRldGVjdG9yIGFuZCBlcS4xIG11bHRpcGx5LgogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8vIGVxLjc6IHRhdSAtPiBhbHBoYSwgb25jZSBwZXIgYmxvY2sgKGstcmF0ZSkuCiAgICAgICAgICAgIGNvbnN0IGFscGhhQXR0YWNrID0gdGltZUNvbnN0YW50VG9Db2VmZmljaWVudChwYXJhbXMuYXR0YWNrLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBhbHBoYVJlbGVhc2UgPSB0aW1lQ29uc3RhbnRUb0NvZWZmaWNpZW50KHBhcmFtcy5yZWxlYXNlLCB0aGlzLnNhbXBsZVJhdGUpOwogICAgICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IHRoaXMucHJvY2Vzc1NhbXBsZShpbnB1dFtpXSwgcGFyYW1zLnRocmVzaG9sZCwgcGFyYW1zLnJhdGlvLCBwYXJhbXMua25lZSwgYWxwaGFBdHRhY2ssIGFscGhhUmVsZWFzZSwgcGFyYW1zLm1ha2V1cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqIFRlcm1pbmFsIHJldGlyZW1lbnQgaXMgZGlzdGluY3QgZnJvbSB0ZW1wb3JhcmlseSBsb3NpbmcgYW4gaW5wdXQgb3IgYnlwYXNzaW5nIGFuIGVmZmVjdC4gKi8KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRWZmZWN0UHJvY2Vzc29yKG5hbWUsIFByb2Nlc3NvcikgewogICAgICAgIGNsYXNzIE93bmVkRWZmZWN0UHJvY2Vzc29yIGV4dGVuZHMgUHJvY2Vzc29yIHsKICAgICAgICAgICAgZGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICAgICAgICAgICAgc3VwZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhICE9PSAiY2Fjb3Bob255OmRpc3Bvc2UiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKCJjYWNvcGhvbnk6ZGlzcG9zZWQiKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5wb3J0LnN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5kaXNwb3NlZCAmJiBzdXBlci5wcm9jZXNzKGlucHV0cywgb3V0cHV0cywgcGFyYW1ldGVycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVnaXN0ZXJQcm9jZXNzb3IobmFtZSwgT3duZWRFZmZlY3RQcm9jZXNzb3IpOwogICAgfQoKICAgIC8qCiAgICAgKiBEeW5hbWljcyBBdWRpb1dvcmtsZXQgc2hlbGwg4oCUIHRoaW4gQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHRoYXQgZGVsZWdhdGVzIEFMTAogICAgICogRFNQIG1hdGggdG8gdGhlIGNvbnRleHQtZnJlZSBEeW5hbWljc1Byb2Nlc3NvciBpbiBkeW5hbWljcy1jb3JlLnRzLiBNaXJyb3JzCiAgICAgKiB0aGUgZGF0dG9ycm8tcmV2ZXJiLnRzIC8gc3RlcmVvLXRvLWJmb3JtYXQudHMgY29yZS9zaGVsbCBzcGxpdDogdGhpcyBmaWxlCiAgICAgKiBvd25zIG9ubHkgdGhlIHdvcmtsZXQgcGx1bWJpbmcgKHBhcmFtZXRlckRlc2NyaXB0b3JzLCBwcm9jZXNzKCksIHRoZQogICAgICogcmVnaXN0ZXJQcm9jZXNzb3IgY2FsbCk7IHRoZSBhbGdvcml0aG0gbGl2ZXMgaW4gdGhlIHVuaXQtdGVzdGVkIGNvcmUuCiAgICAgKgogICAgICogQWxnb3JpdGhtOiBmZWVkLWZvcndhcmQgZHluYW1pYyByYW5nZSBjb21wcmVzc29yL2xpbWl0ZXIvZXhwYW5kZXIvZ2F0ZSBwZXIKICAgICAqIEdpYW5ub3VsaXMsIE1hc3NiZXJnICYgUmVpc3MgMjAxMiAoc2VlIGR5bmFtaWNzLWNvcmUudHMgaGVhZGVyIGZvciB0aGUgZnVsbAogICAgICogY2l0YXRpb24gYW5kIHBlci1lcXVhdGlvbiBjb21tZW50cykuCiAgICAgKi8KICAgIGNvbnN0IFdPUktMRVRfTE9HX1BSRUZJWCA9ICJbY2Fjb3Bob255L3dvcmtsZXQ6ZHluYW1pY3NdIjsKICAgIC8qKgogICAgICogUmF0aW8gc2VudGluZWw6IHRoZSB3b3JrbGV0J3MgQXVkaW9QYXJhbSBjYW5ub3QgY2FycnkgK0luZmluaXR5LCBzbyBhCiAgICAgKiBsaW1pdGVyIGlzIGV4cHJlc3NlZCBhcyBhIHZlcnkgbGFyZ2UgZmluaXRlIHJhdGlvIGhlcmUgYW5kIHRyZWF0ZWQgYXMKICAgICAqICItPmluZmluaXR5IiBieSB0aGUgZ2FpbiBjb21wdXRlciAoc2xvcGUgZWZmZWN0aXZlbHkgMCBhYm92ZSB0aHJlc2hvbGQpLgogICAgICogY3JlYXRlTGltaXRlcigpIGluIGNhY29waG9ueS50cyBzZXRzIHRoZSByYXRpbyB0byB0aGlzIHZhbHVlLgogICAgICovCiAgICBjb25zdCBMSU1JVEVSX1JBVElPID0gMTAwMDsKICAgIGNsYXNzIER5bmFtaWNzV29ya2xldFByb2Nlc3NvciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvciB7CiAgICAgICAgLy8gT25lIHN0YXRlZnVsIGNvcmUgcGVyIGNoYW5uZWwgc28gZWFjaCBjaGFubmVsIGtlZXBzIGl0cyBvd24gYmFsbGlzdGljcwogICAgICAgIC8vIGVudmVsb3BlIChlcS4xNiBkZXRlY3RvciBzdGF0ZSkgYWNyb3NzIHByb2Nlc3MoKSBibG9ja3MuCiAgICAgICAgY29yZXMgPSBbXTsKICAgICAgICBzdGF0aWMgZ2V0IHBhcmFtZXRlckRlc2NyaXB0b3JzKCkgewogICAgICAgICAgICAvLyBEZWZhdWx0IFZBTFVFUyBjb21lIGZyb20gRFlOQU1JQ1NfREVGQVVMVFMgKGR5bmFtaWNzLWNvcmUudHMpIOKAlCB0aGUgc2luZ2xlCiAgICAgICAgICAgIC8vIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgd2l0aCB0aGUgZ2F0ZSByZWdyZXNzaW9uIHRlc3RzLiBSYW5nZXMgbGl2ZSBoZXJlCiAgICAgICAgICAgIC8vIGFuZCBjb3ZlciBjb21wcmVzc29yIChyYXRpbyA+PSAxKSwgbGltaXRlciAocmF0aW8gLT4gbGFyZ2UpLCBhbmQgZG93bndhcmQKICAgICAgICAgICAgLy8gZXhwYW5kZXIvZ2F0ZSAocmF0aW8gPCAxKSBmcm9tIG9uZSBwYXJhbWV0ZXIgc2V0LgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgWyJ0aHJlc2hvbGQiLCBEWU5BTUlDU19ERUZBVUxUUy50aHJlc2hvbGQsIC0xMDAsIDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsicmF0aW8iLCBEWU5BTUlDU19ERUZBVUxUUy5yYXRpbywgMC4wNSwgTElNSVRFUl9SQVRJTywgImstcmF0ZSJdLAogICAgICAgICAgICAgICAgWyJrbmVlIiwgRFlOQU1JQ1NfREVGQVVMVFMua25lZSwgMCwgNDAsICJrLXJhdGUiXSwKICAgICAgICAgICAgICAgIFsiYXR0YWNrIiwgRFlOQU1JQ1NfREVGQVVMVFMuYXR0YWNrLCAwLCAxLCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbInJlbGVhc2UiLCBEWU5BTUlDU19ERUZBVUxUUy5yZWxlYXNlLCAwLCA1LCAiay1yYXRlIl0sCiAgICAgICAgICAgICAgICBbIm1ha2V1cCIsIERZTkFNSUNTX0RFRkFVTFRTLm1ha2V1cCwgLTI0LCAyNCwgImstcmF0ZSJdLAogICAgICAgICAgICBdLm1hcCgoW25hbWUsIGRlZmF1bHRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBhdXRvbWF0aW9uUmF0ZV0pID0+ICh7CiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsCiAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbWluVmFsdWUsCiAgICAgICAgICAgICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsCiAgICAgICAgICAgICAgICBhdXRvbWF0aW9uUmF0ZTogYXV0b21hdGlvblJhdGUsCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbMF07CiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF07CiAgICAgICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQubGVuZ3RoID09PSAwIHx8ICFvdXRwdXQgfHwgb3V0cHV0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gay1yYXRlIHBhcmFtczogdGFrZSB0aGUgZmlyc3QgKGNvbnN0YW50LW92ZXItYmxvY2spIHZhbHVlLiBBIHJhdGlvIGF0IG9yCiAgICAgICAgICAgIC8vIGFib3ZlIHRoZSBsaW1pdGVyIHNlbnRpbmVsIGlzIG1hcHBlZCB0byArSW5maW5pdHkgc28gdGhlIGNvcmUncyBnYWluCiAgICAgICAgICAgIC8vIGNvbXB1dGVyIHVzZXMgdGhlIGV4YWN0IGxpbWl0ZXIgc2xvcGUgKDApIHJhdGhlciB0aGFuIDEvTElNSVRFUl9SQVRJTy4KICAgICAgICAgICAgY29uc3QgcmF0aW9QYXJhbSA9IHBhcmFtZXRlcnMucmF0aW9bMF07CiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICAgICAgICAgIHRocmVzaG9sZDogcGFyYW1ldGVycy50aHJlc2hvbGRbMF0sCiAgICAgICAgICAgICAgICByYXRpbzogcmF0aW9QYXJhbSA+PSBMSU1JVEVSX1JBVElPID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogcmF0aW9QYXJhbSwKICAgICAgICAgICAgICAgIGtuZWU6IHBhcmFtZXRlcnMua25lZVswXSwKICAgICAgICAgICAgICAgIGF0dGFjazogcGFyYW1ldGVycy5hdHRhY2tbMF0sCiAgICAgICAgICAgICAgICByZWxlYXNlOiBwYXJhbWV0ZXJzLnJlbGVhc2VbMF0sCiAgICAgICAgICAgICAgICBtYWtldXA6IHBhcmFtZXRlcnMubWFrZXVwWzBdLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBjaGFubmVsQ291bnQgPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIG91dHB1dC5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29yZXNbY2hdKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3Jlc1tjaF0gPSBuZXcgRHluYW1pY3NQcm9jZXNzb3Ioc2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmNvcmVzW2NoXS5wcm9jZXNzKGlucHV0W2NoXSwgb3V0cHV0W2NoXSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBjb25zb2xlLmluZm8oYCR7V09SS0xFVF9MT0dfUFJFRklYfSBtb2R1bGUgZXZhbHVhdGluZ2ApOwogICAgdHJ5IHsKICAgICAgICByZWdpc3RlckVmZmVjdFByb2Nlc3NvcigiZHluYW1pY3MiLCBEeW5hbWljc1dvcmtsZXRQcm9jZXNzb3IpOwogICAgICAgIGNvbnNvbGUuaW5mbyhgJHtXT1JLTEVUX0xPR19QUkVGSVh9IHJlZ2lzdGVyUHJvY2Vzc29yIGNvbXBsZXRlYCk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGAke1dPUktMRVRfTE9HX1BSRUZJWH0gcmVnaXN0ZXJQcm9jZXNzb3IgZmFpbGVkYCwgZXJyb3IpOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQoKICAgIGV4cG9ydHMuRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yID0gRHluYW1pY3NXb3JrbGV0UHJvY2Vzc29yOwoKICAgIHJldHVybiBleHBvcnRzOwoKfSkoe30pOwovLyMgc291cmNlTWFwcGluZ1VSTD1keW5hbWljcy1idW5kbGUuanMubWFwCg==\""],"mappings":";AAAA,IAAA,IAAe"}